如何在 python 中获取 2D 直方图每个箱中的最大值



我正在使用numpy,特别是histrogram2d函数。我正在用 2D 直方图对点(数组 xyz)的 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])

但是,对于庞大的数据集,最后一行中的循环可能非常慢。关于如何使其更快的任何想法?

以下是我将如何做到这一点,对不起,我现在没有时间编写代码:

  1. 使用numpy.ravel_multi_index将 2D 问题转换为 1D 问题。
  2. 看看 numpy.unique 的实现,你想做这样的事情来获得唯一的 bin 值,但你想以这样一种方式来做到这一点,以便它同时给你 d 的最小/最大值。 numpy.lexsort在这里也可能有所帮助。
  3. 要移回2d空间,它应该像img2.flat[uniq_1d_bin_value] = bin_max一样简单

我希望这足以让你开始。如果你有问题,你可以发布你的代码,让我们知道你在哪里卡住了,也许我或其他人可以帮助你再次走上正确的道路。

最新更新