我有一个1D的“from”数组(称之为“frm”),其中包含具有关联布尔掩码数组的值:“mask”(与“frm”形状相同)。然后我有第三个“replace”数组:“repl”,也是1D,但长度比其他两个数组都要短。
基于这些,我想生成一个新数组(“to”),其中包含“frm”值,除非在这种情况下“mask == True”,否则应该按顺序从“repl”中取值。 (请注意,“mask”中的“True”元素数等于“repl”的长度)。
我正在寻找一种“聪明”的numpy实现方式? 我看过像np.where,np.take,np.select,np.choose这样的方法,但似乎都不适合我的需求?
“切入代码”,到目前为止,这是我所拥有的。它可以正常工作,但似乎不是“Numpythonic”?(甚至不是Pythonic)
基于这些,我想生成一个新数组(“to”),其中包含“frm”值,除非在这种情况下“mask == True”,否则应该按顺序从“repl”中取值。 (请注意,“mask”中的“True”元素数等于“repl”的长度)。
我正在寻找一种“聪明”的numpy实现方式? 我看过像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]
(背景:我需要这样做的原因是,我正在子类化Pandas pd.Dataframe类,并且需要一个用于列/索引的“setter”。由于pd.Index不能进行“切片索引”,因此我需要首先复制索引/列数组,根据掩码替换副本中的某些元素,然后让setter设置完整的新值。 如果有更优雅的解决方案,请告诉我。
df.columns[3]
可以工作。但是df.columns[3] = "new-name"
会出现TypeError: "Index does not support mutable operations"
(这促使我将其带入numpy进行解决)。 - Hans Bouwmeester