2017-02-28 27 views
0

設置我有一個大的(〜100GB)數據集結構numpy的陣列x,我想斌分別由物業p1,並希望找到平均值和財產p2標準偏差的xs每個垃圾桶。我的方法如下所示,但速度很慢。有沒有更快/更numpythonic的方式來做到這一點?我無法將整個數據集放在內存中,但是我有很多內核,所以平行化的好方法也不錯。平均大數據與垃圾箱中numpy的

nbins=30 
bin_edges=np.linspace(0,1,nbins) 

N, p2_total, means_p2, stds_p2 = np.zeros((4,nbins))  

for x in xs_generator(): 
    p1s = x['p1'] 
    p2s = x['p2'] 

    which_bin=np.digitize(p1s,bins=bin_edges) 

    for this_bin,bin_edge in enumerate(bin_edges): 
     these_p1s = p1s[which_bin==this_bin] 
     these_p2s = p2s[which_bin==this_bin] 

     N[this_bin]   += np.size(these_p1s) 
     p2_total[this_bin] += np.sum(these_p2s) 
     p2sq_total[this_bin] += np.sum(these_p2s**2) 

means_p2 = p2_total/N 
stds_p2 = np.sqrt(p2sq_total/N**2) 

回答

1
  • 你應該使用np.histogram:

    N, binDump = np.histogram(p1s, bins=bin_edges) 
    p2_total, binDump = np.histogram(p1s, bins=bin_edges, weights=p2s) 
    p2sq_total, binDump = np.histogram(p1s, bins=bin_edges, weights=p2s**2) 
    
    means_p2 = p2_total/N 
    stds_p2 = np.sqrt(p2sq_total/N**2) 
    

這樣你可以避免循環,你只需重新寫直方圖功能:)

+0

謝謝爲了你的回答,它非常整齊。儘管我期望它的執行速度更快,但實際上幾乎完全是同一時間。它也給出了稍微不同的答案,但我沒有檢查哪一個會導致更大的錯誤。 –

+0

表現失望,對不起。你應該在'xs'循環中並行化。要做到這一點,請看http://www.perrygeo.com/parallelizing-numpy-array-loops-with-cython-and-mpi.html。這不是一個正確的答案,但我希望你能找到有用的東西 –