簡體   English   中英

有沒有比遍歷 numpy arrays 更快的方法?

[英]Is there a faster way than looping over numpy arrays?

如果我有兩個 numpy arrays 的值; 我怎樣才能快速制作第三個數組,讓我知道前兩個 arrays 中兩個值相同的次數?

例如:

x = np.round(np.random.random(2500),2)
xIndex = np.linspace(0, 1, 100)

y = np.round(np.random.random(2500)*10,2)
yIndex = np.linspace(0, 10, 1000)

z = np.zeros((100,1000))

現在,我正在執行以下循環(速度非常慢):

for m in x:
    for n in y:
        q = np.where(xIndex == m)[0][0]
        l = np.where(yIndex == n)[0][0]
        z[q][l] += 1

然后我可以做 xIndex、yIndex 和 z 的輪廓 plot(或加熱 map,或其他)。 但我知道我並沒有采用“Pythonic”方式來解決這個問題,而且我無法在任何接近合理的時間范圍內運行我為此擁有的數億個數據點。

我該如何以正確的方式做到這一點? 謝謝閱讀!

您可以顯着截斷代碼。

首先,由於您有一個線性刻度,您可以在其中進行裝箱,因此您可以完全消除明確的 arrays xIndexyIndex 您可以將確切的索引表示為z

xi = np.round(np.random.random(2500) * 100).astype(int)
yi = np.round(np.random.random(2500) * 1000).astype(int)

其次,你不需要循環。 普通+運算符(又名np.add )的問題是它被緩沖了。 這樣做的結果是您不會對同一索引的多次出現獲得正確的計數。 幸運的是,ufunc 有一個at方法來處理它, add是一個 ufunc。

第三,也是最后,廣播允許您指定如何將 arrays 網格化以獲得一個奇特的索引:

np.add.at(z, (xi[:, None], yi), 1)

如果您正在構建 2D 直方圖,則不需要對原始數據進行舍入。 您可以只舍入索引:

x = np.random.random(2500)
y = np.random.random(2500) * 10

z = np.zeros((100,1000))
np.add.at(z, (np.round(100 * x).astype(int), np.round(100 * y).astype(int)), 1)

暫無
暫無

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

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