如何矢量化(即从中删除 for 循环)这段从时间序列生成离散 PDF 的代码

How to vectorize (i.e. remove the for loop from) this piece of code which generates a discrete PDF from a time series

我正在编写一个执行以下任务的函数:

它采用 N 个点 X[i] 的时间序列,并产生一个 PDF p:[X_min,X_max]->R,它在每个 M 上都是分段常数等间距 'bins' [X_min, X_min + delta], [X_min + delta, X_min + 2*delta], ..., [X_max - delta,X_max](所以 delta=(X_max-X_min)/M),表示时间序列在每个 bin 中花费的时间。更准确地说,它生成一个数组 P,其中 P[i] = #{k : X[k]\in[X_min + i* delta, X_min + i*(delta+1)]} /N.

因此,我的函数将长度为 N 的 numpy 数组 X = [X[0], ..., X[N-1]] 以及指定有多少 bin 的数字 M 作为输入,并生成为输出一个长度为 M 大小为 1.

的 numpy 数组 P = [P[0], ..., P[M-1]]

到目前为止,我的代码依赖于 for 循环,看起来像这样:

import numpy as np
def func(X,M):
    N=np.size(X)
    P = np.array([0]*M)
    X_min = np.amin(X)
    X_max = np.amax(X)
    delta = (X_max - X_min)/M
    for k in np.arange(N):
        j = int( (X[k]-X_min) // delta )
        P[j] += 1
    P = P / N
    return P

我需要在大型数组的计算中多次使用此函数,一位朋友告诉我,我可以通过向量化而不是使用 for 循环来大大加快速度。我可以看到如何通过定义长度为 N 的 'counting vector' J = ((X-X_min) // delta).astype(int) 来矢量化循环的第一部分,它指示时间序列的每个元素属于哪个 bin,但是我不确定如何实现第二部分(即从 J 构造一个向量 P,以便 P[i] 计算整数 i 在 J 中出现的次数)而不用回退到 for 循环。

有没有人知道如何使用现有的矢量化函数或其他方式有效地编写我想要的代码?

非常感谢! A.

我们可以将循环部分替换为np.bincount -

P = np.bincount(((X-X_min) // delta).astype(int), minlength=M)