假設我有一系列 2d 坐標(x, y),每個坐標對應一個權重。在我將它們排列成箱(即一個小正方形區域)后,我想找到落入每個箱的權重之和。我過去常常np.digitize查找我的資料屬于哪個 bin,然后我使用回圈在每個 bin 中添加了權重。我的代碼是這樣的:
import numpy as np
x = np.random.uniform(low=0.0, high=10.0, size=5000) #x variable
y = np.random.uniform(low=0.0, high=10.0, size=5000) #y variable
w = np.random.uniform(low=0.0, high=10.0, size=5000) #weight at each (x,y)
binx = np.arange(0, 10, 1)
biny = np.arange(0, 10, 1)
indx = np.digitize(x, binx)
indy = np.digitize(y, biny)
#initialise empty list
weight = [[0] * len(binx) for _ in range(len(biny))]
for n in range(0, len(x)):
for i in range(0, len(binx)):
for j in range(0, len(biny)):
if indx[n] == binx[i] and indy[n] == biny[j]:
weight[i][j] = w[n]
但是輸出的第一行weight是空的,沒有意義。為什么會發生這種情況?有沒有更有效的方法來做我想做的事?
編輯:我在下面有一個很好的答案(我接受了一個),但我想知道如果我將垃圾箱作為浮標是如何作業的?
uj5u.com熱心網友回復:
您可以通過簡單的索引來做到這一點。首先得到每個方向的bin號。您不需要np.digitize均勻間隔的垃圾箱:
xbin = (x // 1).astype(int)
ybin = (y // 1).astype(int)
現在制作一個輸出網格:
grid = np.zeros_like(w, shape=(xbin.max() 1, ybin.max() 1))
現在使用重復的 bin 正確完成添加的技巧是在無緩沖模式下進行。Ufuncs 就像np.add有一個方法at只是為了這個目的:
np.add.at(grid, (xbin, ybin), w)
附錄
這種方法對于任何偶數大小的 bin 都是完全通用的。假設你有
x = np.random.uniform(low=-10.0, high=10.0, size=5000)
y = np.random.uniform(low=-7.0, high=12.0, size=5000)
xstep = 0.375
ystep = 0.567
假設您想計算以x.min()和開頭的 bin y.min()。您可以改為使用固定偏移量,甚至適用np.clip于越界索引,但這將留給讀者作為練習。
xbin = ((x - x.min()) // xstep).astype(int)
ybin = ((y - y.min()) // ystep).astype(int)
其他一切都應該與原始簡化案例相同。
繪制直方圖時,您的 x 和 y 軸將是
xax = np.linspace(x.min(), x.min() xstep * xbin.max(), xbin.max() 1) 0.5 * xstep
yax = np.linspace(y.min(), y.min() ystep * ybin.max(), ybin.max() 1) 0.5 * ystep
我避免使用np.arange這里來最小化舍入誤差。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/402816.html
標籤:
上一篇:在保持組內順序的同時重復陣列
