Python 缩放/旋转成对平方欧氏距离的矢量化计算
给定一组存储在(n,d)数组中的维数为d的n个向量和第二组相同维数的m个向量(存储在(m,d)数组中),我想计算向量之间的平方点距离,由矩阵a按大小(d,d)缩放 输出应该是(n,m)数组 我预计m和n的输入范围在1到10.000之间,d的输入范围在1到100之间 两点之间的距离由下式给出: 在未优化但仍在运行的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
将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