【问题标题】:How to delete elements from multidimensional array where sum of values equals 0?如何从值总和等于0的多维数组中删除元素?
【发布时间】:2017-04-16 02:47:52
【问题描述】:

我在一个多维数组masks 中有一堆 32 x 32 灰度图像,如下所示:

(2560, 1, 32, 32)

如果我对它们的值求和,其中一些图像包含非零值。

我想从多维数组中删除值之和为零的元素。

这就是我的处理方式:

for idx in range(masks.shape[0]):
    if np.sum(masks[idx]) == 0:
        masks = np.delete(masks, idx)

在找到零和元素的第一次迭代之后,masks 的形状发生了变化

(2560, 1, 32, 32)

(2621439,)

为什么会发生这种情况,我该如何解决?我想要的是只减少第一维,例如

(2120, 1, 32, 32)

【问题讨论】:

  • 查看np.delete 文档。如果不指定axisdelete 将在展平数组上运行。试试masks = np.delete(masks, idx, axis=0)
  • 删除所有零元素后你打算看到什么?
  • @RobertValencia 类似(2120, 1, 32, 32)

标签: python arrays python-3.x numpy multidimensional-array


【解决方案1】:

根据文档,您得到一个一维数组,因为您没有为 np.delete 提供 axis 参数:

如果axis 为None,则obj 将应用于展平数组。

此外,在删除元素时循环遍历数组并不是一个好主意,这使得跟踪索引变得很困难,因为对象的大小在变化:

对于您的情况:

masks = masks[masks.sum(axis=(1,2,3)) != 0]

应该删除轴1,2,3的所有值之和为零的数组。

【讨论】:

  • 这使用布尔索引;它不会修改原始数组而是返回一个新数组,如果您希望它被覆盖,您可以将结果分配回masks
  • 这行得通——我应该在 OP 中提到的一个问题是我正在使用此数组中已删除图像的索引来也删除上的相应图像另一个形状相同的阵列——有什么建议吗?
  • 说如果另一个相同形状的数组是arr,那么类似地你可以做arr[masks.sum(axis=(1,2,3)) != 0]根据masks的总和删除相应的元素。
  • 问题是masks 是一个二值化数组,arr 的值介于(0, 255) 之间——masks 上的0 可能是@987654332 上的低非零值@ - 正如您所指出的,在循环时我无法索引大小变化的对象...
  • 如果 arr.shape == masks.shape 并且您想删除 arr 中 mask.sum 为零的元素。那么我建议的方法应该有效,除非我误解了你的问题,它们包含什么数据类型并不重要。 masks.sum(axis=(1,2,3)) != 0 是一个布尔向量,可以应用于任何具有相同长度的向量,用于元素选择。
猜你喜欢
  • 2012-04-27
  • 2011-05-26
  • 2017-04-11
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多