这里是Python的初学者。因此,我在尝试仅使用numpy库计算输入矩阵行之间的二进制成对hammington距离矩阵时遇到了困难。我应该避免循环并使用向量化。例如,如果我有类似的东西:
[ 1, 0, 0, 1, 1, 0]
[ 1, 0, 0, 0, 0, 0]
[ 1, 1, 1, 1, 0, 0]
矩阵应该类似于:
^{pr2}$即如果原始矩阵是A,而hamming距离矩阵是B,B[0,1]=汉明距离(A[0]和A[1])。在本例中,答案是2,因为它们只有两个不同的元素。在
所以我的代码是这样的
def compute_HammingDistance(X):
hammingDistanceMatrix = np.zeros(shape = (len(X), len(X)))
hammingDistanceMatrix = np.count_nonzero ((X[:,:,None] != X[:,:,None].T))
return hammingDistanceMatrix
不过,它似乎只是返回一个标量值,而不是预期的矩阵。我知道我可能在数组/向量广播方面出了点问题,但我不知道如何解决它。我试过用np.总和而不是np.count_非零但他们都给了我相似的东西。在
因为我不明白的原因
对于更大的阵列,似乎比@Psidom快得多:
^{pr2}$对于一个非常小的例子,Psidom的速度要快一些:
更新
部分原因似乎是浮动比其他数据类型快:
尝试此方法,沿
axis = 1
创建一个新轴,然后使用sum
进行广播和计数真值或非零:^{pr2}$
解释:
1)创建具有形状(3,1,6)的三维阵列
2)这是一个二维数组,有形状(3,6)
3)这会触发广播,因为它们的形状不匹配,并且2d数组arr首先沿着3d arrayarr[:,None,:]的0轴广播,然后对(3,6)的shape(1,6)数组进行广播。两个广播步骤一起对原始阵列进行笛卡尔比较。
4)沿着第三个轴的
sum
计算有多少个元素不相等,即trues给出了hamming距离。相关问题 更多 >
编程相关推荐