【问题标题】:Setting specific values to 0 in a NumPy array在 NumPy 数组中将特定值设置为 0
【发布时间】:2019-05-22 23:07:19
【问题描述】:

我有两个数组(gtpred),值范围从 0 到 4。

这两个数组的形状是(1, 1, 93, 349, 219)。我的目标是创建一个掩码以忽略并将其乘以 gt 和 pred 以忽略两个数组中的值。但是,我遇到了一个问题

ignore_value=4
if ignore_value is not None:
    mask[gt!=ignore_value]=1  # ignore value mask
    gt=mask*gt
    pred=mask*pred  # ignore value mask for pred


print "after removing ignore value: ", np.unique(gt),np.unique(pred)
output: after removing ignore value:  [0 1 2 3] [0 1 2 3 4]

为什么不删除pred 中的忽略值?

【问题讨论】:

  • 你是如何初始化mask的?
  • @coldspeed mask=np.zeros(gt.shape, dtype=np.int32)
  • 其他,这段代码是在你将这些数组传递给的函数内部调用的吗?
  • @coldspeed yes、gt、pred 和 ignore_value 是传递给函数的输入参数
  • 啊,好的。我知道了。您基于 gt 初始化了一个掩码,但 pred 可能不一定在与 gt 相同的单元格中有 4s。最重要的是,您需要两个单独的掩码。

标签: python arrays python-2.7 numpy


【解决方案1】:

IMO,更好的解决方案是使用布尔索引并将单元格显式设置为 0。

gt[gt == ignore_value] = 0
pred[pred == ignore_value] = 0

一般来说,不能保证gtpred 会在同一个单元格中包含ignore_value,因此对它们使用单​​个掩码是不合适的。

但是,上面的代码可以工作并且效率更高,因为它只对数组的一小部分进行操作,而不是全部(就像将它们相乘那样)。是输出

【讨论】:

  • 谢谢你的帮助,如果我这样写怎么办:gt=np.where(gt==ignore_value,0,gt) pred=np.where(pred==ignore_value,0,pred)
  • @S.EB 它会工作,但会生成一个新数组。效率不高。
猜你喜欢
  • 2023-03-07
  • 2018-08-29
  • 2016-10-20
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多