2017-02-28 35 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。这不是一个正确的答案,但我希望你能找到有用的东西 –