[英]Set 3D numpy array value to 0 if last axis index is smaller than value in another 2D array
我有一个形状为(m,n,p)的3D数组a
和a
形状为(m,n)的2D数组idx
。 我希望最后一个轴索引小于idx
相应元素的a
中的所有元素都设置为0。
以下代码有效。 我的问题是:有没有更有效的方法?
a = np.array([[[1, 2, 3],
[4, 5, 6]],
[[7, 8, 9],
[10, 11, 12]],
[[21, 22, 23],
[25, 26, 27]]])
idx = np.array([[2, 1],
[0, 1],
[1, 1]])
for (i, j), val in np.ndenumerate(idx):
a[i, j, :val] = 0
结果是
array([[[ 0, 0, 3],
[ 0, 5, 6]],
[[ 7, 8, 9],
[ 0, 11, 12]],
[[ 0, 22, 23],
[ 0, 26, 27]]])
使用broadcasting
创建3D蒙版,然后使用boolean-indexing
分配零-
mask = idx[...,None] > np.arange(a.shape[2])
a[mask] = 0
另外,我们也可以使用内置的NumPy进行更大范围的比较以获得该蒙版-
mask = np.greater.outer(idx, np.arange(a.shape[2]))
在给定的样本上运行-
In [34]: mask = idx[...,None] > np.arange(a.shape[2])
In [35]: a[mask] = 0
In [36]: a
Out[36]:
array([[[ 0, 0, 3],
[ 0, 5, 6]],
[[ 7, 8, 9],
[ 0, 11, 12]],
[[ 0, 22, 23],
[ 0, 26, 27]]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.