Numpy,3d阵列的所有成对相关性

问题描述:

我有一个形状(l,m,n)的数组。我试图计算形状(l,m,n)的距离矩阵,其中entry(i,j,k)是向量(i,j,:)和(i,:,k)之间的系数。我没有发现任何符合法案的numpy或scipy。Numpy,3d阵列的所有成对相关性

我尝试使用for循环并沿着轴0进行迭代,然后将其馈送到scipy.spatial.distance.pdist,但由于pdist本身使用嵌套for循环需要很长时间。实质上,我想要做的是执行pdist向下的轴0,但理想情况下,它使得pdist不使用for循环。

任何想法?

我会亲自写一点Cython函数来做到这一点(http://cython.org)。编写和测试迭代纯Python版本(与环路),它移动到.pyx用Cython文件,添加类型声明,并按照NumPy的集成指南:

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

似乎是工作,但如果你”使用Python进行计算,一些基本的Cython技能非常值得培养,因为它使编写C扩展更容易。

有什么想法?

  1. 首先想到的是,你不能只要计算这样的距离为m!= N
  2. 其次想到的是,的pdist内部循环不应该打扰你,如果这些都写在C,所以可能的原因是不是在执行,但在需要
  3. 最后的思考的计算量,你的问题可能是由numpy.einsum和线性代数来解决:

代码(我假设是最佳):

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