问题描述
我正在尝试实现矢量化,以解决该问题
Fastest way to get hamming distance for integer array
r = (1 << np.arange(64,dtype=np.uint64))[:,None]
def hamming_distance_v2(a,b):
t = np.bitwise_xor(a,b)
p = np.bitwise_and(t,r)
return np.count_nonzero(p != 0)
例如,我想将2d数组作为第一个参数传递
a = [[127,255],[127,255]]
b = [127,240]
hamming_distance_v1(a,b) -> [4,4]
ValueError: unable to broadcast argument 1 to output array
是否有一种方法可以在当前实现的汉明距离上实现矢量化,或者通过其他方法来计算2d和1d数组之间的距离?
解决方法
根据Q&A链接的答案,他们将进行修改以合并额外的暗部,如下所示。
方法1
def hamming_distance(a,b):
r = (1 << np.arange(8))[:,None]
mask = (a[:,None] & r) != (b & r)
return mask.sum((1,2))
方法2
def hamming_distance_v2(a,None]
xor = np.bitwise_xor(a[:,None],b)
mask = (xor & r) != 0
return mask.sum((1,2))
方法3
另一个与np.unpackbits
-
def hamming_distance_v3(a,b):
a = np.asarray(a,dtype=np.uint8)
b = np.asarray(b,dtype=np.uint8)
m = np.unpackbits(a,axis=1) != np.unpackbits(b)
return m.sum(1)
样品运行-
In [107]: a
Out[107]:
array([[127,255],[127,205],[227,255]])
In [108]: b
Out[108]: array([127,240])
In [109]: hamming_distance(a,b)
Out[109]: array([4,5,8])