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

如何在python中获得2D直方图的每个格中的最大值,python,numpy,Python,Numpy,我正在使用numpy,特别是histrogram2d函数。 我将点阵列x、y和z的3D空间分布与2d直方图组合。对于每个点,我都有一个相关的密度场d 如果我做那样的事 import numpy as np H, xedges, yedges = np.histogram2d(x,y,bins=200,weights=d) 直方图H表示在这种情况下沿z轴视线的密度总和。考虑到我使用的是非常大的阵列,这是非常快速和简单的 现在我想更进一步,我不想沿着视线绘制密度场的总和,而是想得到每个二维箱中密度

我正在使用numpy,特别是histrogram2d函数。 我将点阵列x、y和z的3D空间分布与2d直方图组合。对于每个点,我都有一个相关的密度场d

如果我做那样的事

import numpy as np
H, xedges, yedges = np.histogram2d(x,y,bins=200,weights=d)
直方图H表示在这种情况下沿z轴视线的密度总和。考虑到我使用的是非常大的阵列,这是非常快速和简单的

现在我想更进一步,我不想沿着视线绘制密度场的总和,而是想得到每个二维箱中密度的最大值。 我对可能的解决方案进行了编码:

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])

然而,对于一个庞大的数据集,最后几行中的循环可能非常慢。有什么办法可以加快速度吗?

下面是我的方法,很抱歉,我现在没有时间编写代码:

使用numpy.ravel_multi_index将二维问题转化为一维问题。 看看numpy.unique的实现,您希望这样做以获得唯一的bin值,但您希望这样做,以便同时也能获得d的最小/最大值。在这里,numpy.lexsort可能也有帮助。 要回到二维空间,它应该像img2一样简单。flat[uniq\u 1d\u bin\u value]=bin\u max
我希望这足以让你开始。如果您遇到问题,您可以发布代码并让我们知道您在哪里遇到了问题,也许我或其他人可以帮助您重新走上正确的道路。

也许您会。。。谢谢,这是我刚才问的一个问题,但它是关于1D数组的。我刚刚编辑了这个问题,以获得我想要的服务水平的最大值,但是可能会很慢,特别是最后一部分。谢谢你的有用评论。但是,我不能使用ravel_multi_索引,因为我的numpy版本没有更新。但我想理解你回答的逻辑。仍然可以为每个单元分配一个索引,以便将问题从2D转换为1D,但问题仍然存在于获取每个单元中的最大值。我将很快发布我编写的初步代码。ravel_multi_index是一个非常简单的函数,如果您使用的是旧版本的numpy,您可以自己重新创建它。获取每个箱子的最大值与获取一组唯一箱子的问题非常相似。看一看numpy.unique的实现,看看您是否可以编写类似的东西,同时为您提供一组唯一的存储箱和每个存储箱中的最大值。