python - Numpy 向量化算法对具有相同时间戳的数字求和

标签 python numpy vectorization

我有两个数组P和T,P[i]是一个数字,时间戳是T[i];可能有重复的时间戳。

我想生成另外两个数组 Q 和 U,其中 Q[i] 具有时间戳 U[i],而 Q[i] 是 P 中具有时间戳 U[i] 的所有元素的总和;

例如,对于

P = [1, 2, 3, 4, 5] T = [0, 0, 1, 1, 1]

我会生产

Q = [3, 12] U = [0, 1];

在 numpy 中是否有一种快速的方法可以将其向量化?

最佳答案

使用 numpy 1.4 或更高版本:

import numpy as np

P = np.array([1, 2, 3, 4, 5]) 
T = np.array([0, 0, 1, 1, 1])

U,inverse = np.unique(T,return_inverse=True)
Q = np.bincount(inverse,weights=P)
print (Q, U)
# (array([  3.,  12.]), array([0, 1]))

请注意,这不是最快的解决方案。我是这样测试速度的:

import numpy as np

N = 1000
P = np.repeat(np.array([1, 2, 3, 4, 5]),N)
T = np.repeat(np.array([0, 0, 1, 1, 1]),N)

def using_bincount():
    U,inverse = np.unique(T,return_inverse=True)
    Q = np.bincount(inverse,weights=P)
    return Q,U
    # (array([  3.,  12.]), array([0, 1]))

def using_lc():
    U = list(set(T))
    Q = [sum([p for (p,t) in zip(P,T) if t == u]) for u in U]
    return Q,U

def using_slice():
    U = np.unique(T)
    Q = np.array([P[T == u].sum() for u in U])
    return Q,U

对于小型阵列,wim's solution更快(N=1):

% python -mtimeit -s'import test' 'test.using_lc()'
100000 loops, best of 3: 18.4 usec per loop
% python -mtimeit -s'import test' 'test.using_slice()'
10000 loops, best of 3: 66.8 usec per loop
% python -mtimeit -s'import test' 'test.using_bincount()'
10000 loops, best of 3: 52.8 usec per loop

对于大型阵列,joris's solution更快(N=1000):

% python -mtimeit -s'import test' 'test.using_lc()'
100 loops, best of 3: 9.93 msec per loop
% python -mtimeit -s'import test' 'test.using_slice()'
1000 loops, best of 3: 390 usec per loop
% python -mtimeit -s'import test' 'test.using_bincount()'
1000 loops, best of 3: 846 usec per loop

我怀疑这在这种情况下是否重要,但基准测试可能会根据 numpy、python、操作系统或硬件的版本而变化。在您的机器上重复这些基准测试不会有什么坏处。

关于python - Numpy 向量化算法对具有相同时间戳的数字求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8003046/

相关文章:

python - 快速响应的命令行脚本

python - 您可以从 numpy 数组或 pandas 数据帧中提取超过阈值的数据索引吗

python - 如何加速马德隆常数的三维求和?

python - 加速 Numpy/Python 中的数组查询

python - 向量化 numpy 数组扩展

python - 如何在 numpy 二维数组中找到与特定列表匹配的所有元素?

python - round() 似乎没有正确舍入

python - 带有 anaconda 和 travis 的多个 python 版本

python - 根据条件创建新的 numpy 数组

python - 用子矩阵替换 numpy 矩阵元素