例如,如果我有通过以下方式初始化的Numpy数组:
a = np.arange(12).reshape(6,2)
[out] array([[ 0, 1],
[ 2, 3],
[ 4, 5],
[ 6, 7],
[ 8, 9],
[10, 11]])
和
mask = np.array([0, 2])
我的目标是按轴上的范围遮罩数组。像这样
for i in mask:
target.append(a[i:i+3,:])
因此,应该是:
[out] array([[[0, 1],
[2, 3],
[4, 5]],
[[4, 5],
[6, 7],
[8, 9]]])
但是效率低下。然后,我尝试了
a[mask:mask+3,:]
但它说
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: only integer scalar arrays can be converted to a scalar index
答案 0 :(得分:2)
方法1
我们可以利用broadcasting
生成所有索引和索引-
In [19]: a
Out[19]:
array([[ 0, 1],
[ 2, 3],
[ 4, 5],
[ 6, 7],
[ 8, 9],
[10, 11]])
In [21]: mask
Out[21]: array([0, 2])
In [24]: a[mask[:,None] + np.arange(3)]
Out[24]:
array([[[0, 1],
[2, 3],
[4, 5]],
[[4, 5],
[6, 7],
[8, 9]]])
方法2
我们还可以利用基于np.lib.stride_tricks.as_strided
的scikit-image's view_as_windows
获得更有效的解决方案-
In [43]: from skimage.util.shape import view_as_windows
In [44]: view_as_windows(a,(3,a.shape[1]))[mask][:,0]
Out[44]:
array([[[0, 1],
[2, 3],
[4, 5]],
[[4, 5],
[6, 7],
[8, 9]]])