我正在尝试以最佳方式在python中计算汉明距离,我在Matlab中发现了一个有趣的实现
Dist = sqrt(bsxfun(@plus,sum(A.^2,2),sum(B.^2,2)') - 2*(A*B') );
我怎样才能把它翻译成Python?我不知道bsxfun在这里做什么。
欧几里得距离,而不是汉明距离。另外,你在A*B'
中有一个复共轭转置,但你没有在A.^2
、B.^2
中共轭矩阵,所以我假设你的矩阵是实数。
您问题中的 Matlab 代码使用 bsxfun
,这是 Matlab 用于单例扩展(广播(的更高级别的函数。Python 中使用 Numpy 广播的等效代码是:
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 中,它也可以更紧凑地完成(使用统计工具箱(,如
Dist = pdist2(A, B);
Python 中的等效版本(使用 Scipy(是
import scipy.spatial
Dist = scipy.spatial.distance.cdist(A, B, 'euclidean')
你知道 MATLAB 的文档非常丰富。您在堆栈中提出问题所花费的时间将通过阅读文档来获取更多信息。
bsxfun 将元素操作应用于启用了隐式扩展的两个数组。比如说,你想应用任何函数(+,-,平均值,异或,最小值,最大值...等(在矩阵和相应的行或列之间,我们使用 BSXFUN,而不是使用重复/扩展第二个数据的行/列到矩阵大小。比如说,我想用 1x3 行添加 3x3 矩阵的 eaxh 行,我必须将数组 1x3 重复三次,使其达到 3x3,然后添加。这可以直接使用 bsxfun 完成
例:
A = rand(3) ;
B = rand(1,3) ;
C = bsxfun(@plus, A, B);
% is same as
C1 = repmat(B,3,1) ;
你可以将某些函数与bsxfun一起使用,你可以从文档中获得。
https://in.mathworks.com/help/matlab/ref/bsxfun.html