使用遮罩和其他数组替换数组中的值

时间:2018-08-31 22:30:35

标签: python arrays pandas numpy indexing

我有一个一维“ from”数组(称为 frm ),其中包含带有关联的布尔掩码数组的值:遮罩(与 frm 相同的形状)。然后,我有第三个“替换”数组: repl ,也是一维的,但长度比其他两个短。

有了这些,我想生成一个包含 frm 的新数组( to ) >值除了,其中 mask == True ,在这种情况下,应按顺序使用 repl 。 (请注意, 掩码 True 元素的数量等于 repl 的长度)。

我正在寻找实现此目的的“灵巧”方法?我查看了诸如 np.where np.take np.select np.choose 之类的方法,但都没有似乎“符合要求”?

“切割代码”,这就是我到目前为止的内容。它工作正常,但似乎不是“ Numpythonic”? (或者甚至是Pythonic)

frm  = [1, 2, 3, 4, 5]
mask = [False, True, False, True, True]
repl = [200, 400, 500]
i = 0; to = []
for f,m in zip(frm,mask):
    if m:
        to.append(repl[i])
        i += 1
    else:
        to.append(f)
print(to)

收益率:[1, 200, 3, 400, 500]

背景:之所以需要这样做,是因为我正在将熊猫 pd.Dataframe 类子类化,并且需要“设置者”作为列/索引。由于无法对 pd.Index 进行“切片索引”,因此我需要首先复制索引/列数组,根据掩码替换副本中的某些元素,然后使用设置器设置一个全新的值。让我知道是否有人对此有更优雅的解决方案。)

1 个答案:

答案 0 :(得分:2)

numpy解决方案:

它非常简单:

# convert frm to a numpy array:
frm = np.array(frm)
# create a copy of frm so you don't modify original array:
to = frm.copy()

# mask to, and insert your replacement values:
to[mask] = repl

然后to返回:

>>> to
array([  1, 200,   3, 400, 500])

pandas解决方案:

如果您的数据框如下所示:

>>> df
   column
0       1
1       2
2       3
3       4
4       5

然后您可以使用loc

df.loc[mask,'column'] = repl

然后您的数据框如下所示:

>>> df
   column
0       1
1     200
2       3
3     400
4     500