Python 使用另一个数组作为深度对 numpy 数组进行切片
Python slicing numpy array using another array as depth
我有一个维度为 (x = 2, y = 2, z = 3) 的 3 维 numpy 数组,如下所示
a = [[[0,1,2],[3,4,5]],
[[6,7,8],[9,10,11]]]
我想从 a 的每个 (x, y) 元素中获取前 N 个元素,其中 N 在另一个大小为 x,y 的数组中定义。例如
b = [[1,2],
[0,0]]
结果应该是
c = [[[0,1],[3,4,5]],
[[6],[9]]
如何在没有循环的情况下执行此操作?
您可以在 a
中给定范围内的元素创建一个掩码,并在需要对 a
进行操作时使用此掩码。如果您希望将掩码和数组封装在一个实体中,请查看 numpy.ma 模块。
a = np.array([[[0,1,2],[3,4,5]],
[[6,7,8],[9,10,11]]])
b = np.array([[1,2],
[0,0]])
mask = np.arange(3)[None,None,:] <= b[:,:,None]
a[mask]
输出:
array([0, 1, 3, 4, 5, 6, 9])
但是,如果您希望输出为非同类数组,我想不出比使用循环更好的方法了。
我有一个维度为 (x = 2, y = 2, z = 3) 的 3 维 numpy 数组,如下所示
a = [[[0,1,2],[3,4,5]],
[[6,7,8],[9,10,11]]]
我想从 a 的每个 (x, y) 元素中获取前 N 个元素,其中 N 在另一个大小为 x,y 的数组中定义。例如
b = [[1,2],
[0,0]]
结果应该是
c = [[[0,1],[3,4,5]],
[[6],[9]]
如何在没有循环的情况下执行此操作?
您可以在 a
中给定范围内的元素创建一个掩码,并在需要对 a
进行操作时使用此掩码。如果您希望将掩码和数组封装在一个实体中,请查看 numpy.ma 模块。
a = np.array([[[0,1,2],[3,4,5]],
[[6,7,8],[9,10,11]]])
b = np.array([[1,2],
[0,0]])
mask = np.arange(3)[None,None,:] <= b[:,:,None]
a[mask]
输出:
array([0, 1, 3, 4, 5, 6, 9])
但是,如果您希望输出为非同类数组,我想不出比使用循环更好的方法了。