Python (稀疏?)numpy.meshgrid上距离的智能计算
我想计算规则3D网格上每对节点之间的距离。网格可能很大,所以我想优化计算(CPU的特权) 经过多次测试后,我放弃了“scitools”模块,该模块仅适用于python2,并使用numpy.meshgrid()和scipy.spatial.distance.pdist()的组合。例如,对于20x20x20网格:Python (稀疏?)numpy.meshgrid上距离的智能计算,python,numpy,scipy-spatial,Python,Numpy,Scipy Spatial,我想计算规则3D网格上每对节点之间的距离。网格可能很大,所以我想优化计算(CPU的特权) 经过多次测试后,我放弃了“scitools”模块,该模块仅适用于python2,并使用numpy.meshgrid()和scipy.spatial.distance.pdist()的组合。例如,对于20x20x20网格: distances = scipy.spatial.distance.pdist(np.transpose(np.array(np.meshgrid(range(-10,10,1),ran
distances = scipy.spatial.distance.pdist(np.transpose(np.array(np.meshgrid(range(-10,10,1),range(-10,10,1),range(-10,10,1)))).reshape([20**3,3]))
它优化了吗
首先“也许这是一种方法……”:我看到在meshgrid中有一个“稀疏”选项,所以我很乐意使用它
np.meshgrid(range(-10,10,1),range(-10,10,1),range(-10,10,1),sparse=True)
而不是
np.meshgrid(range(-10,10,1),range(-10,10,1),range(-10,10,1))
事实上,我甚至可以将稀疏形状保留在内存中,因为它在代码的后面会很方便。但是我没有找到一个令人满意的语法来将pdist()与稀疏网格相结合 我不确定使用稀疏网格将为您带来什么。您可以节省网格本身的空间,但仍然需要计算相同数量的成对距离,最终结果仍然是根据pdist上的文档“压缩”矩阵 如果您试图优化将要执行的距离计算的数量,则栅格规则间隔的事实立即表明需要进行一些优化 下面是一个算法:
广播
,它们可以以相同的方式使用。例如,如果求和或相乘,两种情况下的结果都是(20,20,20)数组。但是如果不进行扩展,稀疏的数组就不能生成(20*20*20,3)数组
这些不是scipy稀疏
数组。这是一个完全不同的概念
查看其中一个
(20,20,20)
数组。是否查看所有重复的列或行<代码>稀疏只是避免重复这些。它只需要20个元素范围
并对其进行重塑。它允许广播
进行隐式重复。您比较过模式产生的阵列吗?
In [494]: [x.shape for x in np.meshgrid(range(-10,10,1),range(-10,10,1),range(-1
...: 0,10,1),sparse=False)]
Out[494]: [(20, 20, 20), (20, 20, 20), (20, 20, 20)]
In [495]: [x.shape for x in np.meshgrid(range(-10,10,1),range(-10,10,1),range(-1
...: 0,10,1),sparse=True)]
Out[495]: [(1, 20, 1), (20, 1, 1), (1, 1, 20)]