【问题标题】:How to add or remove a specific element from a numpy 2d array?如何从 numpy 二维数组中添加或删除特定元素?
【发布时间】:2019-07-16 06:45:00
【问题描述】:

给定以下 numpy 数组:

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

删除并返回:

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

我想从这个数组中删除 5。或仅删除 arr[1][2]。当我使用del arr[i][j] 时,它会引发以下错误。 ValueError: cannot delete array elements 和 numpy 文档对我来说并不清楚这个案例。

同样如何在同一个数组的某些行中添加一个元素?

具体来说,当我使用 opencv 读取图像时,我遇到了这个错误。

rgb_image = cv2.imread("image.png")

del 操作给了我最大的错误,我无法使用 np.delete(...) 来实现它

【问题讨论】:

  • 删除操作后你期待什么?具有 8 个元素的展平数组或 3x3 数组,其中删除的元素被替换为 0 或其他占位符值?
  • 这不是二维数组,我不想完全删除一列或一行。只应删除特定元素。
  • 你会为每个数组做多个操作吗?
  • 请注意,结果不会是数组,因为每行元素的数量不会是恒定的,因此您不妨为此使用列表

标签: python numpy opencv numpy-ndarray


【解决方案1】:

一个numpy数组(ndarray)是quote

ndarray 是一个(通常是固定大小的)多维容器,包含相同类型和大小的项目。

因此,如果您想使用 ndarray 数据结构(及其所有优化),则不能有不同长度的行。

一个可能的解决方法是有一个列表数组

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

(注意空行以转义 ndarray 数据类型)

这样您就可以从其中一个列表中删除一个元素

>>> arr
array([list([1, 2, 3]), list([4, 5, 6]), list([7, 8, 9]), list([])],
      dtype=object)
>>> arr[1]=np.delete(arr[1], [1], axis=0)
>>> arr
array([list([1, 2, 3]), array([4, 6]), list([7, 8, 9]), list([])],
      dtype=object)

【讨论】:

  • 通常对对象 dtype 数组的操作比对等效嵌套列表的操作要慢。而且np.delete 比列表del 慢得多。 np.delete 将其输入转换为一个数组(如果还没有的话),并返回一个新数组。
【解决方案2】:

我认为一种方法是将 np.array 转换为列表并重复转换为 np.array,如下所示:

arr = arr.tolist()
arr[1].pop(1)
arr = np.array(arr)

编辑: 似乎是对的,麻木的方式:

np.delete(arr, [4, 4])
np.split(arr, [3, 5, 9])

编辑2: 似乎并没有减少耗时,但您可以这样检查:

arr =  np.empty(3, dtype=np.object)
arr[:] = [1,2,3], [4,5,6], [7,8,9]
arr[1].remove(5)

【讨论】:

  • 这很贵。这是对图像的操作,假设这必须重复宽度 * 高度 * 100 次。
  • 我明白了,也许你可以像这样使用 np.delete:new = np.delete(arr, [4, 4]),然后以某种方式拆分为列表元素。
  • 这里的拆分是做什么的?
  • 而且正如我提到的arr[:] = [1,2,3], [4,5,6], [7,8,9] 行仅用于初始化。如果您只读取图像数组,则应该在预处理之前这样做......所以在您的情况下,它将是 arr[:] = im.read(path) #or something like that
  • arr.tolist() 相当快。
【解决方案3】:

首先使用
new_list = list(old_array) 函数将数组转换为列表。(这将创建一个数组列表)

现在,您可以执行列表的所有操作,如 pop、filter、 等,以删除您想要的任何元素。

最后,当您拥有过滤列表时,使用将其转换回数组

new_array = np.array(new_list) .(这个新数组将保留旧数组的维度)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2019-11-15
    • 1970-01-01
    • 2015-06-08
    相关资源
    最近更新 更多