2015-12-16 4 views
1

Работает с numpy на некоторое время. Как раз тогда, когда я думаю, что у меня есть массивы, он меня выбрасывает еще одну кривую. Например, я строю 3D-массив pltz, а затемФормы numpy массивов

>>> gridset2 = range(0, pltx.shape[2], grdspc) 
>>> pltz[10,:,gridset2].shape 
(17, 160) 
>>> pltz[10][:,gridset2].shape 
(160, 17) 

Почему на Земле две разные формы?

+2

Это одна из причин не использовать синтаксис 'arr [x] [y]'; логика, которая делает ее эквивалентной «arr [x, y]» для случая, когда x и y являются скалярами (а arr не является матрицей) не обобщает прошлое скалярного случая. – user2357112

+2

Кроме того, объединение базовой индексации (с ':') и расширенной индексацией (со списком) является странным и сложным. Соответствующий раздел документации [здесь] (http://docs.scipy.org/doc/numpy-1.10.0/reference/arrays.indexing.html#combining-advanced-and-basic-indexing). – user2357112

ответ

3

Поскольку ваше индексирующее выражение имеет как :, так и список в нем, NumPy должен применять как базовые, так и расширенные правила индексирования, а также то, как они взаимодействуют, что-то странное. Соответствующая документация - here, и вы должны проконсультироваться с ней, если хотите узнать полную информацию. Я сосредоточусь на той части, которая вызывает несоответствие этой формы.

Когда все компоненты индексирующего выражения, которые используют расширенную индексацию, находятся рядом друг с другом, размеры результата, поступающего из расширенной индексации, помещаются в результат в положение заменяемых размеров. Расширенные компоненты индексирования - подобные массиву, такие как массивы, списки и скаляры; скаляры также могут использоваться в базовой индексации, но для этой цели они считаются передовыми. Таким образом, если arr.shape == (10, 20, 30) и ind.shape = (2, 3, 4), то

arr[:, ind, :].shape == (10, 2, 3, 4, 30) 

Ваше первое выражение попадает в этом случае.


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

arr[ind, :, ind] 

результат должен иметь размерность длины 2, 3, 4 и 20, и нет хорошее место, чтобы приклеить 20.

Когда передовые компоненты индексации отделены друг от друга основным индексирование компонентов, NumPy сохраняет все размеры, возникающие в результате расширенной индексации в начале массива результатов. Основными компонентами индексации являются :, ... и np.newaxis (None). Второе выражение относится к этому случаю.


Поскольку ваше второе выражение имеет расширенные компоненты индексирования разделенных основных компонентов индексирования и ваше первое выражение не ваши два выражения используют различные правила индексации. Чтобы этого избежать, вы можете разделить базовую индексацию и расширенную индексацию на два этапа или заменить базовую индексацию эквивалентной расширенной индексацией. Независимо от того, что вы делаете, я рекомендую поставить пояснительный комментарий выше такого кода.

3

Вы должны рассказать нам о gridset2 и форме pltz.

Но я вывел из документации, которая user2357112 дали нам

len(gridset2) == 17 
pltz.shape[1] == 160 

http://docs.scipy.org/doc/numpy-1.10.0/reference/arrays.indexing.html#combining-advanced-and-basic-indexing

  • Расширенные индексы разделены кусочком, многоточие или newaxis. Например, x[arr1, :, arr2].
  • Продвинутые индексы находятся рядом с друг на друге. Например, x[..., arr1, arr2, :], но не x[arr1, :, 1] , поскольку 1 является продвинутым индексом в этом отношении.

В первом случае размеры в результате усовершенствованной операции индексации первые пришли в массиве результатов, а размеры подпространственных после этого. Во втором случае , размеры от операций расширенных индексаций вставляются в массив результатов на то же место, как они были в исходном массиве

>>> pltz[10,:,gridset2].shape 
(17, 160) 

Это первый случай, цитаты, срез посередине. gridset2 - advanced indexing (например, [1,2,3, ...]). Он ставится первым; после 0 000 000

>>> pltz[10][:,gridset2].shape 
(160, 17) 

с pltz[10], новый массив (вид) является 2d '(160, N)». Теперь он помещает размер 17 dim last, второй - в документацию.

Смежные вопросы