3

大家好,很抱歉发了这么长的帖子

我在大小为 (13720,3) 的二维数组中有一个 3 维坐标 (x,y,z) 数组。我想制作坐标的点密度图,这样我就可以看到哪些区域有很多观察结果,以及我们什么都看不到的地方。请注意,没有与坐标相关的值 - 但如果使用与坐标相关的值更容易,我可以制作一个跨越整个体积的网格并将 1 分配给观察值,将 0 分配给没有观察值的地方。

这里已经有关于这个的很好的线程:How to plot a 3D density map in python with matplotlib

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

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。我可以从我链接的线程中看到,多处理可以加快评估速度 - 这很好,但我不太确定如何实现它 - 我完全不理解他的最后一个脚本(如果你想知道为什么他的优化不在我的代码中)

除了对数据进行分箱的微弱尝试外,我不知道如何进行。任何投入将不胜感激 :)

4

0 回答 0