我正在使用numpy,特别是histrogram2d函数。
我正在使用2d直方图对点(数组x
,y
和z
)的3D空间分布进行分级。对于每个点,我都有一个关联的密度字段d
。
如果我这样做
import numpy as np
H, xedges, yedges = np.histogram2d(x,y,bins=200,weights=d)
直方图H
表示沿视线的密度之和(在本例中为z轴)。考虑到我正在使用非常大的数组,这非常快速和简单。
现在我想更进一步,而不是沿着视线绘制密度的总和,我希望得到每个2D箱中密度的最大值。 我编写了可能的解决方案:
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 :(得分:0)
我会这样做,对不起,我现在没有时间编写代码:
numpy.ravel_multi_index
将2d问题转变为1d问题。numpy.unique
的实现,你想做类似的事情来获取唯一的bin值,但是你想以这样的方式做到这一点,这样它也会给你最小值/最大值同时d
。 numpy.lexsort
也可能对此有所帮助。img2.flat[uniq_1d_bin_value] = bin_max
我希望这足以让你入门。如果您遇到问题,可以发布您的代码并告诉我们您遇到的问题,也许我或其他人可以帮助您重新走上正确的道路。