Учитывая массив 1D X
длины n
в Numpy с k
различными значениями, я хочу подвести итог для каждого из этих отдельных значений c
в другом 1D массиве Y
с такой же длиной,все эти элементы Y[idx]
, где X[idx] == c
наиболее эффективным способом.
Пример:
X = [1, 3, 2, 1, 2]
и Y = [0.1, 0.2, 0.5, 2.0, 0.3]
.Длина n
равна 5, и у нас есть k=3
различных значений в X
.Это означает, что результатом нашей операции является вектор из k=3
различных элементов [1, 3, 2]
в X
и соответствующих сумм от элементов Y
, равных [2.1, 0.2, 0.8]
.Также хорошо, если отдельные элементы упорядочены.Таким образом, [1, 2, 3]
с [2.1, 0.8, 0.2]
также будет решением.
Я уже искал различные функции в Numpy, и наиболее близким к тому, что я хочу, является np.unique(X, return_counts=True)
, но он возвращает количество, а не суммы вY.
Конечно, все можно решить с помощью неприятного цикла, например:
import numpy as np
X = np.array([1, 3, 2, 1, 2])
Y = np.array([0.1, 0.2, 0.5, 2.0, 0.3])
def unique_sums(x, y):
distinct_x = np.unique(x)
y_sums = np.empty(distinct_x.shape)
for idx, val in enumerate(distinct_x):
y_sums[idx] = np.sum(y[x == val])
return distinct_x, y_sums
unique_sums(X, Y)
, приводящего к упорядоченному результату:
(array([1, 2, 3]), array([2.1, 0.8, 0.2]))
Есть ливекторизованная операция, подобная этой, в Numpy или любой другой обычной библиотеке Python?Если нет, то какая реализация будет наиболее эффективной в Cython?