将一行从 Matlab (bsxfun with plus) 翻译成 Python



我正在尝试以最佳方式在python中计算汉明距离,我在Matlab中发现了一个有趣的实现

Dist = sqrt(bsxfun(@plus,sum(A.^2,2),sum(B.^2,2)') - 2*(A*B') );

我怎样才能把它翻译成Python?我不知道bsxfun在这里做什么。

这是

欧几里得距离,而不是汉明距离。另外,你在A*B'中有一个复共轭转置,但你没有在A.^2B.^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

最新更新