【问题标题】:pairwise hamming distance between numpy arrays considering non-zero values only仅考虑非零值的numpy数组之间的成对汉明距离
【发布时间】:2020-04-28 23:11:09
【问题描述】:

我想计算二维 numpy 数组的成对汉明距离。

我的数组是

A
array([[-1,  0, -1,  0, -1,  0],
       [ 1,  0,  0,  0,  0,  0],
       [ 0,  0,  1,  1,  1,  0],
       [ 0,  0, -1,  1,  0,  0],
       [ 0,  0,  0,  0, -1,  0]], dtype=int8)

我想计算 A 的行之间的汉明距离,但只考虑非零值。如果其中一项为零,我们不将其包括在计算中。

我的输出应该是

B
array([[0, 1, 2, 0, 0],
       [1, 0, 0, 0, 0],
       [2, 0, 0, 1, 1],
       [0, 0, 1, 0, 0],
       [0, 0, 1, 0, 0]], dtype=int8) 

【问题讨论】:

  • 你能定义汉明距离吗?也许展示一个你将如何实现它的循环,以避免歧义。
  • 你的数组只有零和一吗?

标签: python python-3.x numpy hamming-distance


【解决方案1】:

如果您的数组只有零和一,那么您具有以下属性:r1 * r2 将在缺失位置包含 0,在元素不同时包含 -1,在元素相同时包含 +1。因此,您希望将所有可能的组合相乘,并计算每行小于零的条目数。

你拿产品带广播:

B = np.count_nonzero(A[:, None, :] * A[None, :, :] < 0, axis=-1)

如果您需要对不总是 -1 和 +1 的值进行泛化,您可以使用类似的技巧来显式检查相等性。对于 ab 两个项目,当且仅当两个数量都非零且不同时,数量 a * b * (a - b) 才会非零:

A1 = A[:, None, :]
A2 = A[None, :, :]
B = np.count_nonzero(A1 * A2 * (A1 - A2), axis=-1)

如果你想明确写出条件,你可以这样做

np.count_nonzero((A1 != A2) & (A1 != 0) & (A2 != 0), axis=-1)

【讨论】:

    【解决方案2】:

    我觉得应该有一个更简单的方法(就速度而言应该没问题,因为一切都是基于数组的,可读性有点困难)。但这是一个可行的解决方案:

    from itertools import permutations
    
    b = np.zeros((a.shape[0], a.shape[0]))
    idx = np.array(list(permutations(range(a.shape[0]),2)))
    b[tuple(idx.T)] = np.count_nonzero(np.logical_and(a[idx.T][0,:]-a[idx.T][1,:], np.logical_and(a[idx.T][0,:]!=0, a[idx.T][1,:]!=0)), axis=1)
    

    您首先使用itertools'permutations 作为索引创建所有可能的行组合,然后为每对行计算逻辑中的非零值,并减去它们它们的非零值

    输出:

    [[0. 1. 2. 0. 0.]
     [1. 0. 0. 0. 0.]
     [2. 0. 0. 1. 1.]
     [0. 0. 1. 0. 0.]
     [0. 0. 1. 0. 0.]]
    

    【讨论】:

    • 有一种更简单的方法,可以保留 dtype。获取给定轴的所有组合的惯用方法是在之前和之后使用 None 索引复制它。
    • @MadPhysicist 我可以看到我可以用a[:, None, :] != a 替换logical_and 的第一个参数,但我不知道如何做同样的事情来排除零。请随时编辑我的帖子,我会学到更多。谢谢。
    • 我不想编辑你的作品。请参阅我的答案,了解我认为最简单的解决方案。
    猜你喜欢
    • 2015-12-20
    • 2015-03-21
    • 2015-07-21
    • 1970-01-01
    • 2020-12-18
    • 2017-04-21
    • 1970-01-01
    • 2017-09-10
    • 2020-10-29
    相关资源
    最近更新 更多