示例如下:
>>> import numpy as np
>>> a=np.zeros((288,512))
>>> x1,x2,y1,y2=0,16,0,16
>>> p=a[x1:x2][y1:y2]
>>> p.shape
(16, 512)
>>> p=a[x1:x2,y1:y2]
>>> p.shape
我尝试从0到16列和0到16行的数组中查询补丁。我以两种方式对数组进行索引,并得到非常不同的结果。 a[x1:x2][y1:y2]
给我错误的结果。
为什么?
感谢您对我的帮助!
答案 0 :(得分:3)
执行a[x1:x2][y1:y2]
时,将按行切片两次。也就是说,a[x1:x2]
将为您提供形状(16,512)
。 a[x1:x2][y1:y2]
中的第二个分片操作将对第一个操作的结果进行分片,并且将获得相同的结果。
在第二种情况下,当您执行a[x1:x2,y1:y2]
时,将按二维数组的两个维度进行切片。
重要说明:如果您有二维数组,并且像这样切片:
a = np.zeros((10,15))
a[1:3].shape
Output:
(2, 15)
您将仅按行切片。您得到的数组将具有2行和总列数(15列)。如果要按行和列进行切片,则必须使用a[1:3, 1:3]
。
答案 1 :(得分:1)
您尝试的两种索引编制方法不等效。在第一个(a[x1:x2][y1:y2]
)中,您实际上是在索引第一根轴两次。在第二个中,您正在索引第一个和第二个轴。
a[x1:x2][y1:y2]
可以重写为
p = a[x1:x2] # result still has two dimensions
p = p[y1:y2]
您首先在第一个维度上索引0:16。然后,您在上一个操作的结果的第一维中索引0:16(由于a[x1:x2]
和x1==y1
的返回值与x2==y2
相同)。
在第二种方法中,直接索引第一维和第二维。我不会这样写,但是可以这样写,以与第一种方法形成对比:
a[x1:x2][:, y1:y2]