为什么以下操作存在差异?它们是如何在库中实现的?
print(prov_img[:19][:20].shape)
Output : (19, 1250)
print(prov_img[:19,:20].shape)
Output : (19, 20)
答案 0 :(得分:6)
prov_img
这里是一个二维数组。
此代码段为您提供prov_img
的前19行(第0行至第18行)和20列(第0列至第19列):
>>> prov_img[:19,:20].shape
(19, 20)
在这里,prov_img[:19]
为您提供了prov_img
的前19行,然后添加[:20]
表示您再次从prov_img[:19]
获得的矩阵中获取前20行:
>>> prov_img[:19][:20].shape
(19, 1250)
由于prov_img[:19]
中有19行,因此切割前20行最终会为您提供所有19行。列中没有切片,因此输出为(19, 1250)
,其中1250是prov_img
矩阵(2d数组)中的列数。
答案 1 :(得分:3)
prov_img
是一个二维数组
prov_img[:19, :] # (19, 1250) - 19 rows of prov_img
(prov_img[:19, :])[:20, :] # (19, 1250); a slice of rows, again
20
没问题,它只需要整个事情,实际上
prov_img[:19, :][:,:]
每个[]
都是独立评估的。
prov_img[:19, :20]
这将选择19行,并从这20列中选择。
prov_img[:19, :][:, :20]
是一回事。
按顺序应用索引时,您必须清楚了解每个阶段的情况。分阶段测试它们。
通常,如果您可以一次索引所有尺寸,请执行此操作。它总是比同等的顺序版本好。
答案 2 :(得分:1)
为了更好地理解,我将再添加一个例子:
<强>代码:强>
x = np.zeros((20,20))
print(x[:3].shape)
print(x[:3][:3].shape)
print(x[:3, :3].shape)
<强>给出:强>
(3, 20)
(3, 20)
(3, 3)
<强>因此... 强>
你从这两个得到的结果相同:
print(x[:3].shape)
print(x[:3][:3].shape)
因为x[:3]
,给出前三列,x[:3][:3]
给出前三列的前三列。