Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy,3d数组的所有成对关联_Python_Numpy_Scipy - Fatal编程技术网

Python Numpy,3d数组的所有成对关联

Python Numpy,3d数组的所有成对关联,python,numpy,scipy,Python,Numpy,Scipy,我有一个形状数组(l,m,n)。我试图计算形状(l,m,n)的距离矩阵,其中entry(I,j,k)是向量(I,j,:)和(I,:,k)之间的系数。我在numpy或scipy中没有找到符合条件的东西 我尝试使用for循环并沿轴0进行迭代,然后将其馈送到scipy.spatial.distance.pdist,但这需要很长时间,因为pdist本身使用嵌套的for循环。本质上,我想做的是在轴0下执行pdist,但理想情况下,这样pdist也不会用于循环 有什么想法吗?我会亲自编写一个小Cython函

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

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


有什么想法吗?

我会亲自编写一个小Cython函数来实现这一点()。编写并测试迭代纯Python版本(使用for循环),将其移动到.pyx Cython文件,添加类型声明,并遵循NumPy集成指南:

可能看起来像是一项工作,但如果您使用Python进行计算,一些基本的Cython技能非常值得培养,因为它使编写C扩展变得更加容易

有什么想法吗

  • 第一个想法是,你不能计算这样的距离,只要m!=n
  • 第二个想法是,如果使用C编写,
    pdist
    的内部循环,则不应困扰您,因此可能的原因不是实现,而是所需的计算量
  • 最后一个想法是,您的问题可以通过numpy.einsum和线性代数解决:
  • 代码(我认为是最优的):

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