Numpy:差异b / w A [:i] [:j]和A [:i,:j]

时间:2017-02-19 17:41:23

标签: python python-3.x numpy

为什么以下操作存在差异?它们是如何在库中实现的?

print(prov_img[:19][:20].shape)
Output : (19, 1250)

print(prov_img[:19,:20].shape)
Output : (19, 20)

3 个答案:

答案 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]给出前三列的前三列。