Numpy,一个3d数组的所有成对相关

时间:2011-10-07 16:01:30

标签: python numpy scipy

我有一个形状(l,m,n)的数组。我正在尝试计算形状(l,m,n)的距离矩阵,其中条目(i,j,k)是向量(i,j,:)和(i,:,k)之间的系数。我没有找到符合条件的numpy或scipy中的任何东西。

我尝试使用for循环并沿轴0迭代,然后将其提供给scipy.spatial.distance.pdist,但这需要很长时间,因为pdist本身使用嵌套for循环。从本质上讲,我想要做的是在0轴上执行pdist,但理想情况下要使pdist不用于循环....

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我会亲自编写一个Cython函数来执行此操作(http://cython.org)。编写并测试迭代的纯Python版本(带有for循环),将其移动到.pyx Cython文件,添加类型声明并遵循NumPy集成指南:

http://docs.cython.org/src/tutorial/numpy.html

看起来似乎很有效但是如果你在Python中进行计算,一些基本的Cython技能非常值得培养,因为它使编写C扩展变得更加容易。

答案 1 :(得分:0)

  

有什么想法吗?

  1. 首先想到的是,只要m!= n
  2. ,就无法计算这样的距离
  3. 第二个想法是pdist的内部循环不应该打扰你,如果那些是用C语言写的,所以可能的原因不在于实现,而在于需要的计算量
  4. 最后的想法是你的问题可以通过numpy.einsum和线性代数来解决:
  5. 代码(我认为是最优的):

    products = numpy.einsum('ijl, ilk -> ijk')
    distances = numpy.einsum('ijj -> ij', products)
    distances = distances[:, :, None] + distances[:, None, :] - 2 * product