2016-10-18 256 views
0

为什么切片4D阵列会给我一个3d阵列?我期望在一个维度中具有范围1的4d阵列。Numpy 4d阵列切片

例子:

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

片阵列:

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

print X[11,:].shape 

给我(1, 96, 96),但我预计(1, 1, 96, 96)

我能做到过b y print X[11:12,:].shape,但我想知道为什么第一种方法不能像我所期望的那样工作?

+1

或者你可以说'X [[11],:] .shape' – jez

回答

2

the docs

一个整数,i,返回作为i:i+1相同的值除返回的对象的维数是通过1降低。特别是,第p个元素为整数(以及所有其他条目:)的选择元组将返回尺寸为N - 1的相应子数组。如果N = 1那么返回的对象是一个数组标量。


因此,当您的索引是一个整数,该索引的值(s)为(是)返回,相应的轴被移除。在一个维度上的行为是你所期望的:

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是一维的,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)