如何解决为什么索引时numpy数组会返回错误形状的子数组
示例如下:
>>> import numpy as np
>>> a=np.zeros((288,512))
>>> x1,x2,y1,y2=0,16,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]
给我错误的结果。
为什么?
感谢您对我的帮助!
解决方法
执行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]
。
您尝试的两种索引编制方法不等效。在第一个(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]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。