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

时间:2015-07-09 12:47:36

标签: 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 = replace_old(dat, old_val, new_val)
print new_dat # [1 11 3 4 57 6 7 8 1 11 3]

1 个答案:

答案 0 :(得分:5)

您可以使用np.place

>>> np.place(dat,np.in1d(dat,old_val),new_val)
>>> dat
array([ 1, 11,  3,  4, 57,  6,  7,  8,  1, 11,  3])

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

  

与ar1相同的布尔数组,即ar1,其中ar1的元素在ar2中,否则为False,否则为

编辑:请注意,前面的配方将根据这些顺序替换old_values,并且@ajcr提到它不适用于其他数组,所以作为现在的一般方法,我建议以下方式使用循环(我不认为这是最好的方式):

>>> 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])

在这种情况下,您创建一个新数组(z),其中包含来自old_valnew_val的相关对,然后您可以将它们传递给np.place并替换他们。