2016-10-18 4 views
0

Почему нарезка 4-мерного массива дает мне 3D-массив? Я ожидал, что 4-мерный массив с размером 1 в одном из измерений.Обрезка массива Numpy 4d

Пример:

print X.shape 
(1783, 1, 96, 96) 

фрагмент массива:

print X[11,:,:,:].shape 

или

print X[11,:].shape 

дает мне (1, 96, 96), но я ожидал (1, 1, 96, 96)

Я могу сделать это б y print X[11:12,:].shape, но мне интересно, почему первый метод не работает, как я ожидаю?

+1

Или вы можете сказать 'X [[11],:] .shape' – jez

ответ

2

Пер the docs:

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


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

In [6]: a = np.arange(5); a 
Out[6]: array([0, 1, 2, 3, 4]) 

In [7]: a[2] 
Out[7]: 2 

In [8]: a[2].shape 
Out[8]:() 

a является 1-мерным, a[2] является 0-мерным.

В более высоких измерениях, если X представляет собой 4-мерный и форм (1783,1,96,96), то X[11,:,:,:] возвращает все значения, где первый индекс оси равняется 11, а затем, что ось удалена. Таким образом, X[11,:,:,:].shape - (1,96,96).

Когда срез определяет диапазон, например, a[2:3] тогда все значения в пределах этого диапазона возвращаются и ось не удаляется:

In [9]: a[2:3] 
Out[9]: array([2]) 

In [10]: a[2:3].shape 
Out[10]: (1,) 

Аналогично, X[11:12, :, :, :] имеет форму (1,1,96,96).

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