numpy中的多维度选择,使用具有意外行为的范围完成

时间:2017-01-25 09:34:52

标签: python arrays numpy

我们假设x是一个形状为numpy.array的三维(3, 22400, 22400)。我想裁剪这个数组的一部分并执行此操作我正在执行以下操作:

x_range = range(0, 224)
y_range = range(0, 224)

现在,当我进行以下选择时,行为似乎是正确的:

x[:, x_range, :].shape == (3, 224, 22400)

但是有多种选择会发生奇怪的事情:

x[:, x_range, y_range].shape == (3, 224)

问题似乎出现在range是一个生成器的问题上,但我不明白这种行为的原因是什么。

系统详情:

print(sys.version)
3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul  5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)]
print(numpy.version.version)
1.11.3

1 个答案:

答案 0 :(得分:2)

<强>问题

您触发了advanced-indexing,导致意外结果。此外,使用的裁剪框尺寸为方形(224, 224)。所以,没有在那里抛出任何错误。

让我们尝试使用非方形裁剪 -

In [40]: x = np.random.randint(11,99,(3,1000,1000))

In [41]: x_range = range(0, 224)
    ...: y_range = range(0, 324)  # Edited from 224 to 324
    ...: 

In [42]: x[:, x_range, y_range]
Traceback (most recent call last):

  File "<ipython-input-42-1bf422b8091c>", line 1, in <module>
    x[:, x_range, y_range]

IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (224,) (324,) 

<强>解决方案

要获得所需的结果,您可以使用np.ix_ -

x[np.ix_(np.arange(x.shape[0]),x_range,y_range)]

示例运行 -

In [34]: x = np.random.randint(11,99,(3,10,10))

In [35]: x_range = range(3, 8) # length = 5
    ...: y_range = range(5, 9) # length = 4
    ...: 

In [36]: out = x[np.ix_(np.arange(x.shape[0]),x_range,y_range)]

In [37]: out.shape
Out[37]: (3, 5, 4)