2012-08-08 40 views
0

我使用的是numpy,特別是histrogram2d函數。 我使用2d直方圖對點的3D空間分佈(數組x,yz)進行裝箱。對於每個點,我都有一個關聯的密度字段d如何在Python中的每個二維直方圖中獲取最大值

如果我做類似的東西

import numpy as np 
H, xedges, yedges = np.histogram2d(x,y,bins=200,weights=d) 

直方圖H代表沿着線的視線的密度(在這種情況下,在z軸)的總和。考慮到我正在處理非常大的陣列,這非常快速和容易。

現在我想更進一步,而不是繪製沿視線密度的總和,我想在每個二維bin中獲得最大密度。 我編寫了可能的解決方案:

from numpy import * 
x=array([0.5,0.5,0.2,0.3,0.2,0.25,0.35,0.6,0.1,0.22,0.7,0.45,0.57,0.65]) 
y=array([0.5,0.5,0.28,0.18,0.85,0.9,0.44,0.7,0.1,0.22,0.7,0.45,0.54,0.65]) 
d=array([1,1,2,2,3,5,6,8,7,9,6,10,5,7]) 

bins=linspace(0,1,64) 

idx=digitize(x,bins) 
idy=digitize(y,bins) 

img2=zeros((len(bins),len(bins))) 

for i in arange(0,len(d)): 
    dummy=idx[i] 
    dummy2=idy[i] 
    img2[dummy][dummy2]=max(d[i],img2[dummy][dummy2]) 

但是在最後幾行的循環可能是一個巨大的數據集很慢。關於如何讓它更快的任何想法?

+0

可能會你... http://stackoverflow.com/questions/10750894/numpy-histogram-how-to-take-the-maximum-value-in-each-bin – 2012-08-08 14:37:09

+0

謝謝,這是一個問題我剛纔問過,但它是關於一維數組。我剛剛編輯了這個問題,以便按照我想要的方式獲得最大值,但可能會很慢,尤其是最後一部分。 – Brian 2012-08-08 16:14:55

回答

0

這裏是我會怎麼做,對不起,我沒有時間,現在寫了代碼:

  1. 使用numpy.ravel_multi_index把二維問題轉化爲一維問題。
  2. 看看numpy.unique的執行情況,你想要這樣做來獲得獨特的bin值,但是你希望以這樣的方式來完成,以便它也可以使d的最小值/最大值保持相同時間。 numpy.lexsort也可能在這裏幫助。
  3. 搬回2D空間應該是這麼簡單img2.flat[uniq_1d_bin_value] = bin_max

我希望這是足以讓你開始。如果你有麻煩,你可以發佈你的代碼,讓我們知道你被困住的地方,也許我或其他人可以幫助你重新走上正確的道路。

+0

感謝您的有用評論。但是,我不能使用'ravel_multi_index',因爲我的numpy版本沒有更新。但我想了解你的答案的邏輯。仍然可以爲每個單元指定一個索引,以便將問題從2D轉換爲1D,但問題仍然是在每個箱中獲取最大值。我將盡快發佈我寫的初步代碼。 – Brian 2012-08-13 16:19:33

+1

'ravel_multi_index'是一個非常簡單的函數,如果您使用的是舊版本的numpy,則可以自己重新創建它。在每個垃圾箱中獲取最大值與獲取一組獨特垃圾箱的問題非常相似。看看numpy.unique的實現,看看你是否可以寫一些類似的東西,在同一時間給你一組獨特的bin和每個bin的最大值。 – 2012-08-13 18:31:03

相關問題