Python 汉明距离的改进

Python 汉明距离的改进,python,xor,Python,Xor,我正在尝试写汉明距离。 作为输入,我有两个矩阵M1和M2,一个是40x20,另一个是50x20;它们包含真/假。我需要计算每行之间的距离,所以M1[0]距离与M2[0],M1[0]与M2[1]。。。M1[39]和M2[49]。产生40x50结果矩阵。我的第一次尝试当然是像这样循环: for x_i in range(X.shape[0]): for x_train_j in range(X_train.shape[0]): distance_results

我正在尝试写汉明距离。
作为输入,我有两个矩阵M1和M2,一个是40x20,另一个是50x20;它们包含真/假。我需要计算每行之间的距离,所以M1[0]距离与M2[0],M1[0]与M2[1]。。。M1[39]和M2[49]。产生40x50结果矩阵。我的第一次尝试当然是像这样循环:

for x_i in range(X.shape[0]):
        for x_train_j in range(X_train.shape[0]):
            distance_results[x_i, x_train_j] = sum(np.logical_xor(x_array[x_i, :], x_train_array[x_train_j, :]))
这是正确的,但是,它对于我的数据来说太慢了。我有一些关于相乘的想法,
M1.dot(M2.T)
,它给出了正确的矩阵形状并一步求和,但当需要相乘和求和xor时:
1*1=1
(需要0-坏)
1*0=0
(需要1-坏)
0*1=0
(需要1-坏)
0*0=0
(需要0-可以)
你知道我怎样才能得到想要的结果吗?我想我错过了一些做得又快又好的数学。 提前感谢。

M1.dot(M2.T)
可以在某种程度上被视为布尔逻辑的
。对于二进制逻辑
A异或B
相当于
(A而不是B)或(不是A和B)
,因此您可以做一件事--

要把它编码起来,你需要小心地在点之前去掉逻辑部分,以便计算出总和。如果你在两个逻辑阵列上点,你将无法得到你想要的结果。我只是使用-1作为not运算符
(True-1=0,False-1=-1)
。此外,这里的“或”实际上是一个总和,因为您正在考虑多个布尔值。最后,你的距离为负值,很容易用绝对值确定

_A = [[ True,  True,  False],
      [ True,  False, True]]

_B = [[ True,  False, False],
      [ False, False, False],
      [ True,  True,  True ]]
预期产出: [[ 1, 2, 1], [1,2,1]]

A = numpy( _A, dtype=bool)
B = numpy( _B, dtype=bool)

numpy.absolute(numpy.dot(A,B.T-1) + numpy.dot(A-1, B.T))

>>>array([[1, 2, 1],
          [1, 2, 1]])

你可以尝试使用numba来加快执行速度。Numba提供“即时”编译以加快执行。这里的更多信息:给定的示例(sum2d)可以很容易地根据您的需要进行调整。我的讲师给出了一些关于使用标量乘法的建议,但我仍然无法确定它是否计算了汉明距离。所以我不明白它丢失了什么,伙计,我要试试。看起来不错。我在想这个问题,但却错过了如何制作负片(-1个技巧)。欺骗我;;)
A = numpy( _A, dtype=bool)
B = numpy( _B, dtype=bool)

numpy.absolute(numpy.dot(A,B.T-1) + numpy.dot(A-1, B.T))

>>>array([[1, 2, 1],
          [1, 2, 1]])