Путь 1
Для простого использования вы можете просто заменить элементы b
следующим образом:
for i in range(3):
b[b==i] = t[i]
Это довольно справедливо, но не эффективно, особенно если вы играете с огромным диапазоном индексов.
Способ 2
Если вы хотите оптимизировать его, вам нужно использовать группировку, как я обсуждал в этом посте . Заимствование из ответа Дивакара, numpy
- единственное решение требует более глубокого понимания:
b = np.array([2, 2, 1, 2, 1, 2, 2, 1, 1, 0, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2])
sidx = np.argsort(b) #indices that would sort an array
bs = b[sidx] #sorted array
# locations of changings in sorted array, [ 0, 3, 7, 20] in this case:
split_idx = np.flatnonzero(np.r_[True,bs[:-1]!=bs[1:],True])
indices = [sidx[i:j] for (i,j) in zip(split_idx[:-1], split_idx[1:])]
Индексы - это список массивов [ 9, 17, 15]
, [2, 4, 7, 8]
, [16, 14, 13, 12, 0, 10, 18, 6, 5, 3, 1, 11, 19]
, который эквивалентно b==0
, b==1
, b==2
, поэтому вы можете использовать их сейчас так:
for i in range(len(indices)):
b[indices[i]] = t[i]
Путь 3
Это наиболее эффективный способ, который я нашел, но numpy
здесь недостаточно:
import pandas as pd
indices = pd.DataFrame(b).groupby([0]).indices.values()
for i in range(len(indices)):
b[indices[i]] = t[i]