【发布时间】:2019-04-18 14:02:00
【问题描述】:
在 Numpy 中给定一个长度为 n 的一维数组 X 和 k 不同的值,我想在另一个具有相同长度的一维数组 Y 中总结每个不同的值 c,所有这些元素 Y[idx] 其中X[idx] == c 以最有效的方式。
例子:
X = [1, 3, 2, 1, 2] 和 Y = [0.1, 0.2, 0.5, 2.0, 0.3]。 n 的长度是 5,我们在 X 中有 k=3 不同的值。这意味着我们操作的结果是X 中k=3 不同元素[1, 3, 2] 的向量以及来自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 中最有效的实现是什么?
【问题讨论】:
-
您能否在某处发布已发布的方法如何在您暗示的 ~10k 到 ~100k 大小的数据集上公平?我猜性能,即运行时是你的首要任务,所以很高兴看看这些是如何叠加的。