我有一个一维“ 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 进行“切片索引”,因此我需要首先复制索引/列数组,根据掩码替换副本中的某些元素,然后使用设置器设置一个全新的值。让我知道是否有人对此有更优雅的解决方案。)
答案 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