我无法弄清楚这两种索引之间的区别。似乎他们应该产生相同的结果,但事实并非如此。有什么解释吗?
答案 0 :(得分:7)
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]
的{{1}}相当于:[]
:
A[1:3][:,0:2]
In [7]: a[1:3][:,0:2]
Out[7]:
array([[4, 5],
[8, 9]])
表示“所有行”。因此,您首先通过:
选择行,然后从所有行中选择列[1:3]
。
答案 1 :(得分:3)
A[1:3][0:2]
表示首先在A上应用[1:3]
,然后对从第一步返回的数组应用[0:2]
,因此两个切片仅应用于行。 OTOH 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]])