Многомерная ошибка Numpy Slicing дает неожиданный результат - PullRequest
1 голос
/ 21 мая 2019

У меня есть многомерный массив этой формы:

(2, 200, 2, 3, 3, 114)

Я хотел бы извлечь из него определенный набор значений с помощью этой команды:

pab[0][:][0][0][0][i]

Так что в основном мне нужнокаждое значение, повторяемое во втором измерении, фиксирует значения в первом, третьем, четвертом и пятом.Последнее измерение находится в цикле.

Тем не менее, похоже, что мой способ нарезки на куски и желание извлечь из второго измерения не работает должным образом.После некоторого расследования я обнаружил, что форма не меняется, как ожидалось.Похоже, я не правильно понял:

>>> pab.shape
(2, 200, 2, 3, 3, 114)
>>> pab[0].shape
(200, 2, 3, 3, 114)
>>> pab[0][:].shape
(200, 2, 3, 3, 114)
>>> pab[0][:][0].shape
(2, 3, 3, 114)             # I would have expected to see (200, 3, 3, 114)
>>> pab[0][:][0][0].shape
(3, 3, 114)

Я нашел несколько статей, в которых говорилось о многомерном разрезании, но ни одна из них не объяснила это поведение, или я их неправильно понял.

Если кто-то может объяснить, почемуформа массива меняется, как показано на рисунке, и не так, как ожидалось, до (200, 3, 3, 114), а также от того, каким будет правильный путь, я был бы очень признателен!В конце концов я пытался получить массив формы (200, )

1 Ответ

1 голос
/ 21 мая 2019

Индексирование numpy с arr[i][j]... работает со всеми скалярами, но не со слайсами. [:] ничего не делает. (Даже со списком [:] просто делает копию.). Итак, вы хотите объединить индексы в одно выражение:

In [40]: arr = np.ones((2, 200, 2, 3, 3, 114),int)                           
In [41]: arr.shape                                                           
Out[41]: (2, 200, 2, 3, 3, 114)
In [42]: arr[0].shape                                                        
Out[42]: (200, 2, 3, 3, 114)
In [43]: arr[0,:,0,0].shape                                                  
Out[43]: (200, 3, 114)
In [44]: arr[0,:,0,0,0,3].shape                                              
Out[44]: (200,)

Помещение среза в середину так может привести к неожиданным результатам:

In [45]: arr[0,:,0,0,0,[1,2]].shape                                          
Out[45]: (2, 200)
In [47]: arr[0][:,0,0,0,[1,2]].shape                                         
Out[47]: (200, 2)

Здесь срез размером 200 переместился в конец. Это неуклюжий случай смешанной базовой и расширенной индексации. https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#combining-advanced-and-basic-indexing

...