Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.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
Matrix 计算给定行向量矩阵的距离矩阵_Matrix_Numpy_Distance - Fatal编程技术网

Matrix 计算给定行向量矩阵的距离矩阵

Matrix 计算给定行向量矩阵的距离矩阵,matrix,numpy,distance,Matrix,Numpy,Distance,假设我有一个矩阵nxm容纳行向量。我想要一个距离矩阵nxn,它表示每个向量之间的距离。当我使用Numpy时,如何在Python中实现它。我知道是西皮干的,但我想弄脏我的手。我已经编写了一个余弦相似函数cos_dist(a,b),其中a和b是两个不同的向量。现在我需要一个调用函数,它可以有效地为每两个项执行调用。我该怎么做 为什么不检查一下scipy's,它计算n维空间中观测值之间的成对距离,并有大量的距离函数可供选择 由于您没有安装scipy,并且希望使用numpy对此进行编码,因此我建议您进行

假设我有一个矩阵nxm容纳行向量。我想要一个距离矩阵nxn,它表示每个向量之间的距离。当我使用Numpy时,如何在Python中实现它。我知道是西皮干的,但我想弄脏我的手。我已经编写了一个余弦相似函数
cos_dist(a,b)
,其中a和b是两个不同的向量。现在我需要一个调用函数,它可以有效地为每两个项执行调用。我该怎么做

为什么不检查一下scipy's,它计算n维空间中观测值之间的成对距离,并有大量的距离函数可供选择


由于您没有安装scipy,并且希望使用numpy对此进行编码,因此我建议您进行研究,该研究链接在其文档页面的左上角。

下面的代码显示了两个选项来完成您想要的操作。一个在数组上循环两次,并使用Python函数计算cos_dist。第二个使用矢量化方法,以更快地获得相同的结果

来自未来进口部的

将numpy作为np导入
def cos_区(a、b):
mod_a=np.sqrt(a.dot(a))
mod_b=np.sqrt(b.dot(b))
返回a.dot(b)/mod_a/mod_b
a=np.rand.rand(100,4)
#慢选
def慢速距离(a):
items=a.shape[0]
out_slow=np.one((项目,项目))
对于X范围内的j(项目):
对于X范围内的k(j+1,项目):
out_slow[j,k]=cos_dist(a[j],a[k])
out_slow[k,j]=out_slow[j,k]
慢退
#更快的选择
从numpy.core.umath_测试导入inner1d
def fast_区(a):
mod_a=np.sqrt(inner1d(a,a))
norm_a=a/mod_a[:,无]
out_fast=inner1d(norm_a[:,None,:],
标准(无,:,:)
快回来
以下是时间安排:

[2]中的
:%timeit slow\u dist(a)
10个回路,最佳3个:每个回路67.6毫秒
在[3]:%timeit fast\u dist(a)
10000圈,最好3圈:每圈60.5美元
在[4]中:np.allclose(慢距离(a),快距离(a))
Out[4]:正确

如果是scipy,为什么不查看相关函数的源代码?它可能只依赖于numpy。未安装并且我不是SUDODo。您知道相关函数的名称吗?你可以在谷歌上搜索源代码。你可能想看看python,它允许你在任何地方安装python及其依赖项,不需要拥有
sudo
特权。@fgb谢谢,但目的是为了编写学习不使用scipy的高效代码谢谢你的努力,但这还不够,因为有很多包装器snp。我希望这至少能让你朝着正确的方向开始。