【问题标题】:Deleting numpy array elements from a 3d numpy array with given array of indices从具有给定索引数组的 3d numpy 数组中删除 numpy 数组元素
【发布时间】:2018-12-20 17:12:26
【问题描述】:

我有一个 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 中的ith 行,仅使用numpy.delete 删除arr[i] 中的ind[i]th 行。

所以本质上是一种更 Pythonic 的方式来做到这一点:

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]]])

【问题讨论】:

  • 您可能需要创建一个新的、较小的数组,然后复制您需要的内容。由于数组不是固定大小的,因此无法在循环中删除您需要的内容。
  • 那么,我发布的代码是实现这一目标的唯一方法吗?啊,rip,我希望 numpy 有一些更优化的方法来做到这一点。
  • 您发布的代码删除了a[i],而不是。您究竟要删除哪一行,行还是列?
  • @QuangHoang,数组是 3d,所以名称“行”和“列”不明确。在这里,OP 正在考虑 0 和 1 轴,您似乎将它们视为 1 和 2。
  • @MatthieuBrucher, np.delete 也创建了一个新数组。

标签: python arrays python-3.x numpy


【解决方案1】:

一个可行的解决方案:

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 感谢您的 cmets,更新了答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多