我们假设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
答案 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)