【问题标题】:How to change numpy array based on mask array?如何根据掩码数组更改 numpy 数组?
【发布时间】:2020-02-29 01:49:41
【问题描述】:

我有一个数组 data_set,大小:(172800,3) 和掩码数组,大小 (172800) 由 1 和 0 组成。我想用我定义的值替换基于掩码数组中的值(0或1)的值形式data_set数组:例如:[0,0,0]或[128,16,128]。

我试过“np.placed”函数,但这里的问题是掩码数组的大小不正确。

我还检查了更 Pythonic 的方式: data_set[mask]= [0,0,0] 它工作得很好,但是对于某些理由,只有 2 个第一个元素。

data_set[mask]= [0,0,0]

data_set = np.place(data_set, mask, [0,0,0])

如果掩码值为 1,我的预期输出是将 data_set 矩阵中元素的值更改为 [0,0,0]。

例如

data_set = [[134,123,90] , [234,45,65] , [32,233,45]]
mask = [ 1, 0, 1]

output = [[0,0,0] , [234, 45,65] , [0,0,0]]

【问题讨论】:

  • 试试data_set[mask.astype(bool)] = 0
  • data_set[np.where(mask)] = 0., data_set[mask == 1] = 0.
  • 谢谢。它适用于 [0,0,0] 但如果我需要用其他值(如 ex. [128,16,128]?
  • data_set[mask.astype(bool)] = [128,16,128]
  • 太棒了!谢谢。

标签: python arrays numpy mask


【解决方案1】:

当您尝试使用 mask 索引您的数据时,numpy 假定您正在给它一个索引列表。使用布尔数组,或将掩码转换为索引列表:

import numpy as np

data_set = np.array([[134,123,90] , [234,45,65] , [32,233,45]])
mask = np.array([1, 0, 1])
val = np.zeros(data_set.shape[1])

data_set[mask.astype(bool),:] = val
# or
data_set[np.where(mask),:] = val

第一个将整数数组转换为布尔数组,而第二个创建掩码不为零的索引列表。

您可以将val 设置为您需要的任何值,只要它与数据集的剩余维度匹配(在本例中为3)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    相关资源
    最近更新 更多