Я хочу найти и заменить несколько значений в 1D массиве/списке новыми.Найти и заменить несколько значений в python
В примере для списка
a=[2, 3, 2, 5, 4, 4, 1, 2]
Я хотел бы заменить
val_old=[1, 2, 3, 4, 5]
с
val_new=[2, 3, 4, 5, 1]
Поэтому новый массив:
a_new=[3, 4, 3, 1, 5, 5, 2, 3]
Каков самый быстрый способ сделать это (для очень больших списков, т. Е. С 50000 значениями для поиска и замены)?
Комментарийизвanwsers
Спасибо всем за быстрый ответ! Я проверил предлагаемые решения со следующими:
N = 10**4
N_val = 0.5*N
a = np.random.randint(0, N_val, size=N)
val_old = np.arange(N_val, dtype=np.int)
val_new = np.arange(N_val, dtype=np.int)
np.random.shuffle(val_new)
a1 = list(a)
val_old1 = list(val_old)
val_new1 = list(val_new)
def Ashwini_Chaudhary(a, val_old, val_new):
arr = np.empty(a.max()+1, dtype=val_new.dtype)
arr[val_old] = val_new
return arr[a]
def EdChum(a, val_old, val_new):
df = pd.Series(a, dtype=val_new.dtype)
d = dict(zip(val_old, val_new))
return df.map(d).values
def xxyzzy(a, val_old, val_new):
return [val_new[val_old.index(x)] for x in a]
def Shashank_and_Hackaholic(a, val_old, val_new):
d = dict(zip(val_old, val_new))
return [d.get(e, e) for e in a]
def itzmeontv(a, val_old, val_new):
return [val_new[val_old.index(i)] if i in val_old else i for i in a]
def swenzel(a, val_old, val_new):
return val_new[np.searchsorted(val_old,a)]
def Divakar(a, val_old, val_new):
C,R = np.where(a[:,np.newaxis] == val_old[np.newaxis,:])
a[C] = val_new[R]
return a
Результаты:
%timeit -n100 Ashwini_Chaudhary(a, val_old, val_new)
100 loops, best of 3: 77.6 µs per loop
%timeit -n100 swenzel(a, val_old, val_new)
100 loops, best of 3: 703 µs per loop
%timeit -n100 Shashank_and_Hackaholic(a1, val_old1, val_new1)
100 loops, best of 3: 1.7 ms per loop
%timeit -n100 EdChum(a, val_old, val_new)
100 loops, best of 3: 17.6 ms per loop
%timeit -n10 Divakar(a, val_old, val_new)
10 loops, best of 3: 209 ms per loop
%timeit -n10 xxyzzy(a1, val_old1, val_new1)
10 loops, best of 3: 429 ms per loop
%timeit -n10 itzmeontv(a1, val_old1, val_new1)
10 loops, best of 3: 847 ms per loop
Относительная разница в увеличении производительности с Biger N
, т.е. если N=10**7
, то результат по Ashwini_Chaudhary принимает 207 ms
и результат by swenzel 6.89 s
.
Здесь довольно много и тот же вопрос: http://stackoverflow.com/questions/3403973/fast-replacement-of-values-in-a-numpy-array В случае нужно родовое Непро- целочисленное решение действительно интересно, что для большого количества замен * Решение Shashank * является самым быстрым. Для небольшого количества замещений наилучшим является решение numpy принятого ответа в связанном вопросе. Замечательно, насколько быстрыми являются словари python и списки. – knedlsepp