Python Numpy:b/w A[:i][:j]和A[:i,:j]的差异
为什么以下操作会有所不同,它们是如何在库中实现的Python Numpy:b/w A[:i][:j]和A[:i,:j]的差异,python,python-3.x,numpy,Python,Python 3.x,Numpy,为什么以下操作会有所不同,它们是如何在库中实现的 print(prov_img[:19][:20].shape) Output : (19, 1250) print(prov_img[:19,:20].shape) Output : (19, 20) prov_img是一个二维数组 prov_img[:19, :] # (19, 1250) - 19 rows of prov_img (prov_img[:19, :])[:20, :] # (19, 1250); a slice of
print(prov_img[:19][:20].shape)
Output : (19, 1250)
print(prov_img[:19,:20].shape)
Output : (19, 20)
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]
这将从这20列中选择19行和
prov_img[:19, :][:, :20]
是一样的
当按顺序应用索引时,您必须清楚地知道每个阶段发生了什么。分阶段进行测试
通常,如果可以一次索引所有维度,请这样做。它总是比同等的顺序版本更好。为了更好地理解,我将在您的示例中再添加一个示例: 代码:
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)
给出:
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]
给出前三列的前三列。prov\u img
在这里是一个2d数组
此代码段为您提供了prov\u 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\u img[:19]
中有19行,因此从中分割前20行最终将为您提供全部19行。列中没有切片,因此您得到的输出为(191250)
,其中1250是prov\u img
矩阵(2d数组)中的列数