繁体   English   中英

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

[英]How to get the maximum in each bin of a 2D histogram in python

我正在使用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. 要移回二维空间,它应该像img2.flat[uniq_1d_bin_value] = bin_max这样简单

我希望这足以让您入门。 如果遇到问题,可以发布代码并告诉我们您遇到的困难,也许我或其他人可以帮助您再次走上正确的道路。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM