大家好,很抱歉长篇
我在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。我可以从我已经链接的线程看到多处理可以加快评估 - 这会很好,但我不太确定如何实现它 - 我完全不理解他的最后一个脚本(只是如果你想知道为什么他的优化不在我的代码中)
除了对数据进行分类的微弱尝试外,我不知道如何继续进行。任何意见将不胜感激:)