Для положительных целых чисел в массивах - zone
и values
мы можем использовать np.bincount
. Основная идея заключается в том, что мы будем рассматривать zone
и values
как строки и столбцы на двумерной сетке. Таким образом, можно сопоставить их с их эквивалентными числами линейного индекса. Они будут использоваться в качестве бинов для суммированного бин с np.bincount
. Их argmax
ID будут номерами режимов. Они отображаются обратно в зона-сетка с индексацией в zone
.
Следовательно, решение будет -
m = zone.max()+1
n = values.max()+1
ids = zone*n + values
c = np.bincount(ids.ravel(),minlength=m*n).reshape(-1,n).argmax(1)
out = c[zone]
Для разреженных данных (хорошо распределенные целые числа во входных массивах), мы можем заглянуть в разреженную матрицу, чтобы получить идентификаторы argmax c
. Следовательно, с разреженной матрицей SciPy -
from scipy.sparse import coo_matrix
data = np.ones(zone.size,dtype=int)
r,c = zone.ravel(),values.ravel()
c = coo_matrix((data,(r,c))).argmax(1).A1
Для небольших перф. Boost, укажите форму -
c = coo_matrix((data,(r,c)),shape=(m,n)).argmax(1).A1
Решение для универсального values
Мы будем использовать pandas.factorize
, вот так -
import pandas as pd
ids,unq = pd.factorize(values.flat)
v = ids.reshape(values.shape)
# .. same steps as earlier with bincount, using v in place of values
out = unq[c[zone]]
Обратите внимание, что для связующих случаев случайным элементом будет выбрано значение values
. Если вы хотите выбрать первый, используйте pd.factorize(values.flat, sort=True)
.