Изменение формы при нарезке numpy arrayx - PullRequest
1 голос
/ 20 апреля 2020

В качестве примера я беру следующий массив:

lights = np.array([ [1,0,1], [0,1,1], [0,0,1], [1,1,1] ])

lights[0] возвращает форму: (3,)

lights[0:1] возвращает форму: (1, 3)

Я не понимаю, что такое логика numpy c в этом случае. Учитывая, что срез является эксклюзивным, [0: 1] аналогично [0]. Итак, почему это влияет на форму массива?

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#basic -slicing-and-indexing

Целое число i возвращает те же значения, что и i: i + 1, за исключением того, что размерность возвращаемого объекта равна уменьшается на 1. В частности, кортеж выбора с p-м элементом целым числом (и всеми другими записями :) возвращает соответствующий подмассив с размерностью N - 1. Если N = 1, то возвращаемый объект является скалярным массивом. Эти объекты объясняются в Scalars.

Эта numpy индексация со скалярами по сравнению со слайсами согласуется с индексацией списка Python:

In [119]: alist = [ [1,0,1], [0,1,1], [0,0,1], [1,1,1] ]                                               
In [120]: alist[0]                                                                                     
Out[120]: [1, 0, 1]     # one element of alist
In [121]: alist[0:1]                                                                                   
Out[121]: [[1, 0, 1]]    # a list with one element
In [122]: alist[0][1]    # nested selection of a number                                                     
Out[122]: 0

эквивалентными массивами, с использование []:

In [123]: arr = np.array(alist)                                                                        
In [124]: arr                                                                                          
Out[124]: 
array([[1, 0, 1],
       [0, 1, 1],
       [0, 0, 1],
       [1, 1, 1]])
In [125]: arr[0]                                                                                       
Out[125]: array([1, 0, 1])
In [126]: arr[0:1]                                                                                     
Out[126]: array([[1, 0, 1]])
In [127]: arr[0,1]                                                                                     
Out[127]: 0

numpy также может индексироваться с помощью кортежей, списков и массивов.

0 голосов
/ 20 апреля 2020

lights - это двумерный массив формы (4,3).

. В случае lights[0] вам нужен первый элемент этого массива, который является 1d-массивом самого размера 3. Следовательно вы получаете форму (3,).

Теперь с lights[0:1] вы не делаете то же самое. Вы вырезаете подмассив. Хотя этот подмассив содержит только один элемент в одном измерении, он все равно является двумерным массивом.

Спросите себя: что произойдет, если вы сделаете lights[0:2]? Вы ожидаете двухмерный массив с формой (2,3), верно? Таким образом, хотя подмассив, возвращаемый lights[0:1], может быть идентичен 1d-массиву, NumPy не может просто отбросить это измерение для вас.

Если вы наберете что-то вроде lights[0:N], где N - переменная и NumPy автоматически отбрасывает 1 измерение, если N=1, вам придется каждый раз обрабатывать этот особый случай отдельно. Простой пример, вы хотите получить фрагмент и установить его второй элемент:

N = 2
t = lights[0:N]
t[0, 1] = 42

Вы можете установить N в 1, и он все еще работает. Теперь измените его на t = lights[0], и ваша программа вылетает в следующей строке, так как ваш массив имеет только 1 измерение. Так что в случае, если NumPy отбросит дополнительное измерение для lights[0:1], вам придется каждый раз писать дополнительный код для этого особого случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...