我试图以最佳方式计算python中的汉明距离,我在Matlab中找到了一个有趣的实现
Dist = sqrt(bsxfun(@plus,sum(A.^2,2),sum(B.^2,2)') - 2*(A*B') );
如何将其翻译为Python?我不明白bsxfun在这做什么。
答案 0 :(得分:2)
那是 Euclidean 距离,而不是汉明距离。此外,您在A.^2
中有一个复共轭转置,但您没有在B.^2
,import numpy as np
A = np.array(A)
B = np.array(B)
Dist = np.sqrt((A**2).sum(1, keepdims=True) + (B**2).sum(1, keepdims=True).T - 2*np.dot(A, B.T))
中对矩阵进行共轭,因此我假设您的矩阵是真实的。
您问题中的Matlab代码使用bsxfun
,这是Matlab用于单例扩展(广播)的更高级别功能。使用Numpy's broadcasting的Python中的等效代码是:
Dist = pdist2(A, B);
在Matlab中,它也可以更紧凑地完成(使用统计工具箱)
import scipy.spatial
Dist = scipy.spatial.distance.cdist(A, B, 'euclidean')
Python中的等效版本(使用Scipy)是
centerPoint
答案 1 :(得分:0)
你知道MATLAB的文档非常丰富。您在堆栈中提出问题的时间将通过阅读文档获取更多信息。
bsxfun 将元素操作应用于启用了隐式扩展的两个数组。比如说,你想在矩阵和相应的行或列之间应用任何函数(+, - ,mean,xor,min,max ......等),我们使用 bsxfun 使用重复/扩展第二个数据的行/列到矩阵大小。说,我想添加1x3行的3x3矩阵的eaxh行,我必须重复数组1x3三次,使其达到3x3然后添加。这可以使用 bsxfun
直接完成示例:
list comprehension
您可以使用 bsxfun 使用某些功能,您可以从文档中获取这些功能。
https://in.mathworks.com/help/matlab/ref/bsxfun.html