簡體   English   中英

如何矢量化(即從中刪除 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

我正在編寫執行以下任務的 function:

它需要 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。

Thus my function takes as input a numpy array X = [X[0], ..., X[N-1]] of length N, together with a number M specifying how many bins, and produces as output a numpy array P = [P[0], ..., P[M-1]],長度為 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

在大型 arrays 的計算中,我需要多次使用這個 function,並且我的一位朋友告訴我,我可以通過矢量化而不是使用 for 循環來大大加快速度。 我可以通過定義一個長度為 N 的“計數向量” J = ((X-X_min) // delta).astype(int)來了解如何對循環的第一部分進行向量化,這表明時間序列的每個元素是哪個 bin屬於,但是我不知道如何實現第二部分(即從 J 構造一個向量 P,以便 P[i] 計算 J 中 integer i 的出現次數)而不回到 for 循環。

是否有人對使用現有的矢量化函數或其他方式有效地編寫我想要的代碼有任何想法?

非常感謝。 一個。

我們可以用np.bincount替換循環部分 -

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM