将Matlab(带有加号的bsxfun)中的一行转换为Python

时间:2017-06-09 08:42:08

标签: python matlab distance

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

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

如何将其翻译为Python?我不明白bsxfun在这做什么。

2 个答案:

答案 0 :(得分:2)

那是 Euclidean 距离,而不是汉明距离。此外,您在A.^2中有一个复共轭转置,但您没有在B.^2import 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