我有一个形状(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不用于循环....
有什么想法吗?
答案 0 :(得分:3)
我会亲自编写一个Cython函数来执行此操作(http://cython.org)。编写并测试迭代的纯Python版本(带有for循环),将其移动到.pyx Cython文件,添加类型声明并遵循NumPy集成指南:
http://docs.cython.org/src/tutorial/numpy.html
看起来似乎很有效但是如果你在Python中进行计算,一些基本的Cython技能非常值得培养,因为它使编写C扩展变得更加容易。
答案 1 :(得分:0)
有什么想法吗?
pdist
的内部循环不应该打扰你,如果那些是用C语言写的,所以可能的原因不在于实现,而在于需要的计算量代码(我认为是最优的):
products = numpy.einsum('ijl, ilk -> ijk')
distances = numpy.einsum('ijj -> ij', products)
distances = distances[:, :, None] + distances[:, None, :] - 2 * product