numpy bitwise_并且无法将参数1广播到输出数组

问题描述

我正在尝试实现矢量化,以解决该问题

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]

如果使用2d数组作为第一个参数,则返回以下错误

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])