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数组)中的列数