Назначение минимального значения с повторяющимися индексами в numpy

#python #arrays #numpy #indexing #duplicates

Вопрос:

У меня есть массив numpy X, который я инициализирую:

X = np.ones(10) * 100

и у меня есть массив индексов для X:

I = np.array([2,5,2,1,7,8,5,2])

и, наконец, массив значений для присвоения X по индексам I:

V = np.array([4,3,5,2,6,2,4,1])

Каков наиболее эффективный способ присвоения значений массиву X, гарантируя, что при наличии повторяющихся индексов в I присваивается минимальное соответствующее значение в V.

То есть я хотел бы, чтобы конечное значение X было:

[100, 2, 1, 100, 100, 3, 100, 6, 2, 100]

Есть ли векторизованный способ сделать это? Или метод, который был бы эффективен для больших массивов? т. Е. Могу ли я избежать использования цикла? Спасибо!

Ответ №1:

Это работает:

 vs = np.argsort(v)
uniq_idx, uniq_vs_idx = np.unique(i[vs], return_index=True)
x[uniq_idx] = v[vs][uniq_vs_idx]