Замените элементы в массиве 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] 

Вы можете использовать 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, который является 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]) 

В этом случае вы создаете новый массив ( z ), который содержит соответствующие пары из old_val и new_val а затем вы можете передать их на np.place и заменить их.