Понимание синтаксиса объединения numpy.r_() - программирование
Подтвердить что ты не робот

Понимание синтаксиса объединения numpy.r_()

Я прочитал следующее в документации numpy для функции r_:

Строковое целое определяет, какая ось стека содержит несколько запятых разделенных массивов. Строка из двух целых чисел, разделенных запятыми позволяет указывать минимальное количество измерений для каждого вход в качестве второго целого (ось для конкатенации вдоль все еще первое целое).

и они приводят этот пример:

>>> np.r_['0,2', [1,2,3], [4,5,6]] # concatenate along first axis, dim>=2
array([[1, 2, 3],
       [4, 5, 6]])

Я не понимаю, что именно строка '0,2' указывает на numpy?

Кроме ссылки выше, есть ли еще сайт с дополнительной информацией об этой функции?

4b9b3361

Ответ 1

'n,m' сообщает r_ объединить вдоль axis=n и создать форму с размером не менее m:

In [28]: np.r_['0,2', [1,2,3], [4,5,6]]
Out[28]: 
array([[1, 2, 3],
       [4, 5, 6]])

Итак, мы конкатенируем вдоль оси = 0, и поэтому мы ожидаем, что результат будет иметь форму (6,), но, поскольку m=2, мы говорим r_, что форма должна быть не менее 2-мерной. Поэтому вместо этого получим форму (2,3):

In [32]: np.r_['0,2', [1,2,3,], [4,5,6]].shape
Out[32]: (2, 3)

Посмотрите, что происходит, когда мы увеличиваем m:

In [36]: np.r_['0,3', [1,2,3,], [4,5,6]].shape
Out[36]: (2, 1, 3)    # <- 3 dimensions

In [37]: np.r_['0,4', [1,2,3,], [4,5,6]].shape
Out[37]: (2, 1, 1, 3) # <- 4 dimensions

Все, что вы можете сделать с помощью r_, также можно выполнить с помощью одной из более читаемых функций построения массива, таких как np.concatenate, np.row_stack, np.column_stack, np.hstack, np.vstack или np.dstack, хотя для вызова может потребоваться reshape.

Даже при вызове для изменения эти другие функции могут быть даже быстрее:

In [38]: %timeit np.r_['0,4', [1,2,3,], [4,5,6]]
10000 loops, best of 3: 38 us per loop
In [43]: %timeit np.concatenate(([1,2,3,], [4,5,6])).reshape(2,1,1,3)
100000 loops, best of 3: 10.2 us per loop

Ответ 2

Строка "0,2" сообщает numpy объединиться вдоль оси 0 (первая ось) и обернуть элементы в достаточном количестве скобок, чтобы обеспечить двумерный массив. Рассмотрим следующие результаты:

for axis in (0,1):
    for minDim in (1,2,3):
        print np.r_['{},{}'.format(axis, minDim), [1,2,30, 31], [4,5,6, 61], [7,8,90, 91], [10,11, 12, 13]], 'axis={}, minDim={}\n'.format(axis, minDim)

[ 1  2 30 31  4  5  6 61  7  8 90 91 10 11 12 13] axis=0, minDim=1

[[ 1  2 30 31]
 [ 4  5  6 61]
 [ 7  8 90 91]
 [10 11 12 13]] axis=0, minDim=2

[[[ 1  2 30 31]]

 [[ 4  5  6 61]]

 [[ 7  8 90 91]]

 [[10 11 12 13]]] axis=0, minDim=3

[ 1  2 30 31  4  5  6 61  7  8 90 91 10 11 12 13] axis=1, minDim=1

[[ 1  2 30 31  4  5  6 61  7  8 90 91 10 11 12 13]] axis=1, minDim=2

[[[ 1  2 30 31]
  [ 4  5  6 61]
  [ 7  8 90 91]
  [10 11 12 13]]] axis=1, minDim=3