仅考虑非零值的 numpy 数组之间的成对汉明距离
pairwise hamming distance between numpy arrays considering non-zero values only
我想计算二维 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)
我觉得应该有一个更简单的方法(就速度而言应该没问题,因为一切都是基于数组的,可读性有点困难)。但这是一个可行的解决方案:
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.]]
如果您的数组只有零和一,那么您有以下 属性:r1 * r2
将在缺少的位置包含 0,在元素不同的位置包含 -1,在元素不同的位置包含 +1相同的。因此,您希望将所有可能的组合相乘,并计算每行中小于零的条目数。
您拍下带播商品:
B = np.count_nonzero(A[:, None, :] * A[None, :, :] < 0, axis=-1)
如果您需要对不总是 -1 和 +1 的值进行概括,您可以使用类似的技巧来显式检查相等性。对于两个项目 a
、b
,当且仅当两个数量都不为零且不同时,数量 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)
我想计算二维 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)
我觉得应该有一个更简单的方法(就速度而言应该没问题,因为一切都是基于数组的,可读性有点困难)。但这是一个可行的解决方案:
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.]]
如果您的数组只有零和一,那么您有以下 属性:r1 * r2
将在缺少的位置包含 0,在元素不同的位置包含 -1,在元素不同的位置包含 +1相同的。因此,您希望将所有可能的组合相乘,并计算每行中小于零的条目数。
您拍下带播商品:
B = np.count_nonzero(A[:, None, :] * A[None, :, :] < 0, axis=-1)
如果您需要对不总是 -1 和 +1 的值进行概括,您可以使用类似的技巧来显式检查相等性。对于两个项目 a
、b
,当且仅当两个数量都不为零且不同时,数量 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)