Python (稀疏?)numpy.meshgrid上距离的智能计算

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

我想计算规则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),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上的文档“压缩”矩阵

如果您试图优化将要执行的距离计算的数量,则栅格规则间隔的事实立即表明需要进行一些优化

下面是一个算法:

  • 循环遍历所有坐标对

  • 创建一个“距离缓存”,它使用坐标对之间的差异作为关键点。例如,距离_cache[(3,4)]=5。这样,如果找到两个彼此具有相同相对距离的坐标,则只需从缓存中查找坐标之间的距离,而不是重新计算

  • 奖励点:仅存储x和y在距离缓存中相对素数的密钥。由于三角形的相似性,相同的缓存项可以重复使用多次密钥。例如,距离([6,8],[0,0])=2*d[(3,4)]=10

  • 非稀疏网格生成3个三维阵列,您可以将这些阵列合并并重塑为3列阵列。稀疏版本也会生成3d阵列,但每个阵列都有不同的形状。通过
    广播
    ,它们可以以相同的方式使用。例如,如果求和或相乘,两种情况下的结果都是(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)]