使用给定的索引数组从3D numpy数组中删除numpy数组元素

3

我有一个numpy数组:

arr = array([[[ 0,  1,  2],
    [ 3,  4,  5],
    [ 6,  7,  8]],

   [[ 9, 10, 11],
    [12, 13, 14],
    [15, 16, 17]],

   [[18, 19, 20],
    [21, 22, 23],
    [24, 25, 26]]])

还有一组索引,ind = array([0, 1, 1])

我想要做的就是对于arr中的第i行,在arr[i]中仅使用numpy.delete删除第ind[i]行。

因此,更具Python风格的方法如下:

x, y, z = arr.shape
new_arr = np.empty((x, y - 1, z))
for i, j in enumerate(ind):
    new_arr[i] = np.delete(arr[i], j, 0)

arr = new_arr.astype(int)

因此,这里的输出将是:
array([[[ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [15, 16, 17]],

       [[18, 19, 20],
        [24, 25, 26]]])

你可能需要创建一个新的、更小的数组,然后复制你需要的内容。由于数组大小不固定,所以无法在循环中删除你需要的内容。 - Matthieu Brucher
1
那么,我发布的代码是实现这个的唯一方法吗? 啊,糟糕,我希望numpy有一些更优化的方法来实现这个。 - Spellstaker
你发布的代码删除了a[i],而不是。你想要删除哪一个,行还是列? - Quang Hoang
抱歉打错了,我是指行。 - Spellstaker
@hpaulj 我知道。我的意思是,由于需要删除不同的索引,您需要使用循环并将部分存储在新的较短数组中,就像 OP 所做的那样。 - Matthieu Brucher
显示剩余2条评论
1个回答

4
一个可行的解决方案:
import numpy as np

arr = np.array([[[0, 1, 2],
                 [3, 4, 5],
                 [6, 7, 8]],

                [[9, 10, 11],
                 [12, 13, 14],
                 [15, 16, 17]],

                [[18, 19, 20],
                 [21, 22, 23],
                 [24, 25, 26]]])


a0, a1, a2 = arr.shape
indices = np.array([0, 1, 1])

mask = np.ones_like(arr, dtype=bool)
mask[np.arange(a0), indices, :] = False

result = arr[mask].reshape((a0, -1, a2))
print(result)

输出

[[[ 3  4  5]
  [ 6  7  8]]

 [[ 9 10 11]
  [15 16 17]]

 [[18 19 20]
  [24 25 26]]]

这并不是什么狡猾的。np.delete可以执行布尔掩码,但不能像您所做的那样推广到二维情况。我正在慢慢朝着这种解决方案努力。最后一个重塑可以是reshape(a0, -1, a2) - hpaulj
@hpaulj 感谢您的评论,已更新答案! - Dani Mesejo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接