问题描述
我无法弄清楚这两种索引之间的区别。 似乎他们应该产生相同的结果,但事实并非如此。 任何解释?
1楼
A[1:3, 0:2]
采用行1-3
和列0-2
因此返回2x2
阵列。
A[1:3][0:2]
首先取行1-3
然后从该子阵列取0-2
行,得到一个2xn
数组,其中n
是原始列数。
In [1]: import numpy as np
In [2]: a = np.arange(16).reshape(4,4)
In [3]: a
Out[3]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
In [4]: a[1:3,0:2]
Out[4]:
array([[4, 5],
[8, 9]])
In [5]: a[1:3]
Out[5]:
array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [6]: a[1:3][0:2]
Out[6]:
array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
使用两个[]
的等价A[1:3,0:2]
是: A[1:3][:,0:2]
:
In [7]: a[1:3][:,0:2]
Out[7]:
array([[4, 5],
[8, 9]])
其中:
表示“所有行”。
因此,您首先通过[1:3]
选择行,然后从所有行中选择列0-2
。
2楼
A[1:3][0:2]
表示首先在A上应用[1:3]
,然后对从第一步返回的数组应用[0:2]
,因此两个切片仅应用于行。
OTOH A[1:3, 0:2]
3,0 A[1:3, 0:2]
表示在行上应用1:3
,在列上应用0:2
,即。
仅获取第二行和第三行,并仅获取这些行的前两列。
>>> import numpy as np
>>> a = np.arange(12).reshape(3, 4)
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a[1:3][0:2]
array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a[1:3] #Get 2nd and 3rd row.
array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> _[0:2] #Get the first two rows of the last array.
array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a[1:3, 0:2]
array([[4, 5],
[8, 9]])