大量坐标的有效点密度

时间:2014-11-25 15:35:57

标签: python scipy kernel-density

大家好,很抱歉长篇

我在2D数组中有一个三维坐标(x,y,z)数组,大小(13720,3)。我想制作坐标的点密度图,这样我就可以看到哪些区域有很多观测值,哪些区域看不到任何东西。请注意,没有与坐标相关联的值 - 但如果使用与坐标相关联的值更容易,我可以创建一个跨越整个卷的网格,并为观察值分配1,将0分配给没有观察值的地方。

这里有关于此的好主题:How to plot a 3D density map in python with matplotlib

但是当我运行下面的代码时,我遇到了无穷大和/或南方的问题

import numpy as np
from os import listdir
from scipy import stats
from mayavi import mlab # will be used for 3d plot when gaussian_kde works

Files = listdir(corrPath)
numHeaders = int(2)

coords = []
for f in Files:
    k = int(0)
    if f[:3] == 'rew':
        fid = open(corrPath+f,'r')
        for line in fid:
            k += 1
            if k > numHeaders:
                 Info = line.split()
                 coords.append(Info[0:3])

    fid.close()


coords = np.array(coords,dtype='float')    
kde = gaussian_kde(coords) # very, very slow - all 8Ggyte of RAM is swallowed - maybe 
                           # multiprocessing will speed it up though - see SO thread

# kde = gaussian_kde(coords.astype(int))  # throws singular matrix error 
                                          # according to np.linalg.cond the condition 
                                          # number is around 4.22

density = kde(coords)

会抛出警告

path/python2.7/site-packages/scipy/stats/kde.py:231: 
RuntimeWarning: overflow encountered in exp result = result + exp(-energy)
path/python2.7/site-packages/scipy/stats/kde.py:240: 
RuntimeWarning: divide by zero encountered in true_divide
result = result / self._norm_factor

,密度

in[16]:  density
Out[16]: array([ inf,  inf,  inf])

我查看了histogramdd(http://docs.scipy.org/doc/numpy/reference/generated/numpy.histogramdd.html)的文档,看看我是否可以对数据点进行分区,这样可以加快计算速度并避免反转矩阵的问题。但我不能让它像我想要的那样工作。这是我的代码

numBins = 280
binCoords, edges = np.histogramdd(coords,bins=(numBins,numBins,numBins))

据我所知,它单独存储我的数据集中的每一列,所以我认为我不能用它来加速stat.gaussian_kde。我可以从我已经链接的线程看到多处理可以加快评估 - 这会很好,但我不太确定如何实现它 - 我完全不理解他的最后一个脚本(只是如果你想知道为什么他的优化不在我的代码中)

除了对数据进行分类的微弱尝试外,我不知道如何继续进行。任何意见将不胜感激:)

0 个答案:

没有答案