pir*_*pir 5 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]
Run Code Online (Sandbox Code Playgroud)
你可以使用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])
Run Code Online (Sandbox Code Playgroud)
要创建掩码数组,您可以使用np.in1d(arr1,arr2)它将为您提供:
一个布尔数组,其长度与ar1相同,即为True,其中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])
Run Code Online (Sandbox Code Playgroud)
在这种情况下,你创建一个新的数组(z),它是包含有关对old_val和new_val,然后你可以将它们传递到np.place并进行更换.