Python 使用新旧值列表替换numpy数组中的元素

Python 使用新旧值列表替换numpy数组中的元素,python,arrays,numpy,Python,Arrays,Numpy,我想使用旧值和新值的列表替换numpy数组中的元素。请参见下面的代码示例(replace_old是请求的方法)。该方法必须同时适用于int、float和string元素。我该怎么做 import numpy as np dat = np.hstack((np.arange(1,9), np.arange(1,4))) print dat # [1 2 3 4 5 6 7 8 1 2 3] old_val = [2, 5] new_val = [11, 57] new_dat = repla

我想使用旧值和新值的列表替换numpy数组中的元素。请参见下面的代码示例(
replace_old
是请求的方法)。该方法必须同时适用于int、float和string元素。我该怎么做

import numpy as np

dat = np.hstack((np.arange(1,9), np.arange(1,4)))
print dat # [1 2 3 4 5 6 7 8 1 2 3]

old_val = [2, 5]
new_val = [11, 57]

new_dat = replace_old(dat, old_val, new_val)
print new_dat # [1 11 3 4 57 6 7 8 1 11 3]
您可以使用:

要创建掩码数组,您可以使用
np.in1d(arr1,arr2)
,它将为您提供:

与ar1长度相同的布尔数组,如果ar1的元素在ar2中为True,否则为False

编辑:请注意,前面的方法将根据这些顺序替换
旧的\u值
,正如@ajcr所提到的,它不适用于其他数组,因此作为一种通用方法,我建议使用循环(我认为这不是最好的方法):


在本例中,您创建一个新数组(
z
),其中包含来自
old_val
new_val
的相关对,然后您可以将它们传递到
np。放置
并替换它们。

我认为,最佳答案很大程度上取决于所涉及数组的典型大小。你有什么迹象吗?不太可能,大约有100万次观察。然而,性能并不是那么关键。小巧的解决方案;我预计这对于所有阵列来说都是近乎最优的,但对于微型阵列来说则不然。但是,涉及np.put的解决方案可能更有效一些,因为它避免了分配和迭代一个完整的掩码数组。@EELCoogendoorn是的,但是由于
np.put
需要细化每个元素的相关索引,并且完成这项工作可能不容易,我认为在这里使用
np.place
更合适!小心:这不会像你期望的那样有效。尝试
dat=[1,2,1,2]
old_val=[1,2]
new_val=[33,66]
。此方法返回
[33,66,33,33]
。数组的最后一个元素没有被正确替换。@ajcr似乎你是对的,让我来解决这个问题!谢谢大家的关注@卡斯拉:我认为OP的问题是希望每个
1
都被
33
替换,每个
2
都被
66
替换。我非常喜欢你建议的方法,但这种方法不太管用。(如果我错了,而这正是OP想要的,我会很高兴地删除评论。)
>>> np.place(dat,np.in1d(dat,old_val),new_val)
>>> dat
array([ 1, 11,  3,  4, 57,  6,  7,  8,  1, 11,  3])
>>> dat2 = np.array([1, 2, 1, 2])
>>> old_val = [1, 2]
>>> new_val = [33, 66]

>>> z=np.array((old_val,new_val)).T
>>> for i,j in z:
...    np.place(dat2,dat2==i,j)
... 
>>> dat2
array([33, 66, 33, 66])