Python 缩放/旋转成对平方欧氏距离的矢量化计算

Python 缩放/旋转成对平方欧氏距离的矢量化计算,python,numpy,vectorization,array-broadcasting,Python,Numpy,Vectorization,Array Broadcasting,给定一组存储在(n,d)数组中的维数为d的n个向量和第二组相同维数的m个向量(存储在(m,d)数组中),我想计算向量之间的平方点距离,由矩阵a按大小(d,d)缩放 输出应该是(n,m)数组 我预计m和n的输入范围在1到10.000之间,d的输入范围在1到100之间 两点之间的距离由下式给出: 在未优化但仍在运行的python代码中,如下所示: 将numpy导入为np v1=np.数组([[1,2], [3, 4], [4, 5]]) v2=np.数组([[1,1], [2, 2], [2, 2

给定一组存储在(n,d)数组中的维数为d的n个向量和第二组相同维数的m个向量(存储在(m,d)数组中),我想计算向量之间的平方点距离,由矩阵a按大小(d,d)缩放

输出应该是(n,m)数组

我预计m和n的输入范围在1到10.000之间,d的输入范围在1到100之间

两点之间的距离由下式给出:

在未优化但仍在运行的python代码中,如下所示:

将numpy导入为np
v1=np.数组([[1,2],
[3, 4],
[4, 5]])
v2=np.数组([[1,1],
[2, 2],
[2, 2],
[0, 0]])
A=np.array([[1,0],[2,3]]
d=np.零((3,4))
对于范围(0,3)内的i:
对于范围(0,4)内的j:
d[i,j]=(v1[i,:]-v2[j,:]).T@A@(v1[i,:]-v2[j,:)
示例点之间的平方距离为:

d=[[3.1.1.17]
[ 43.  17.  17.  81.]
[ 81.  43.  43. 131.]]
是否有一个版本可以避免python中的嵌套循环,例如使用广播黑魔法

编辑:

本案

A = np.array([[1,0], [0, 1]])
这是正常的平方欧几里德距离,可以计算,例如

from scipy.spatial.distance import cdist

cdist(v1,v2,'sqeuclidean')
我们可以使用-

另外,在
np.einsum
中将
optimize
标志设置为
True
以使用BLAS,从而使用该标志

矢量化方法说明

原始代码是-

d[i,j] = (v1[i,:] - v2[j,:]).T @ A @ (v1[i,:] - v2[j,:])
一、我们正在翻译:

v1[i,:] - v2[j,:]
到使用
广播的外部操作

v1[:,None,:]-v2
示意性地说:

v1[:,None,:]  :  m x 1 x n
v2            :      m x n
output, V     :  m x m x n

有关
广播的更多信息,请参见


二,。接下来,
(v1[i,:]-v2[j,:]).T@A@(v1[i,:]-v2[j,:])
使用新的
V
成为
np.einsum(
ijk,kl,ijl->ij',V,A,V)
,使用
einsum
的字符串表示法。可以在中找到更多信息。

您是否可以使用
dist=numpy.linalg.norm(a-b)
来查找两个矩阵之间的距离差?甚至是
dot
产品?我不知道怎么做,所以我提出了这个问题。请参见编辑以获得澄清。如果您试图计算
v1
v2
之间的距离,或
A
d
之间的距离,但按比例缩放,我会将公式添加到问题中。输入中列数的典型值是多少?哇,对我来说至少有两个数量级的加速!非常感谢。你能解释一下这是怎么回事吗?或者你能给我指一个资源,除了你链接的文档之外,还可以解释einsum吗?@AlexbGoode添加了一些评论。
v1[:,None,:]  :  m x 1 x n
v2            :      m x n
output, V     :  m x m x n