首页 > 解决方案 > 我可以避免循环遍历同一操作的向量(Python)吗?

问题描述

我有一个向量,并且必须对向量的每个元素进行相同的计算。它是需要给定值的频率的分类数据的相似性度量。在这种情况下,我想计算 x 的两点 a 和 b 之间的距离

x = np.array([[1, 1, 1],
              [2, 1, 1]])
a = x[0]; b= x[1]

pairwise_dist = []
for i in range(len(a)):
    freq_a = sum(x[:, i] == a[i])
    freq_b = sum(x[:, i] == b[i])

    match = 1
    missmatch = 1/(1 + np.log(freq_a)*np.log(freq_b))
            
    pairwise_dist.append((a[i] == b[i]) * match + (a[i] != b[i]) * missmatch)

dist = sum(pairwise_dist)/len(a)

它总是相同的操作,并且总是只有向量的第 i 个元素。不应该将其矢量化吗?

标签: pythonnumpyloopsfor-loopvectorization

解决方案


Numpy 的广播几乎可以处理你的循环所做的所有事情。您需要的唯一特殊行为是在计算and值时numpy.sum使用参数,因为您不想一次对所有轴求和(因为这会给您一个标量,而不是一个向量)。axisfreq_afreq_b

x = np.array([[1, 1, 1],
              [2, 1, 1]])
a = x[0]
b = x[1]

freq_a = np.sum(x == a, axis=0)
freq_b = np.sum(x == b, axis=0)

match = 1
missmatch = 1/(1 + np.log(freq_a)*np.log(freq_b))

pairwise_dist = (a == b) * match + (a != b) * missmatch

dist = np.sum(pairwise_dist)/len(a)

请注意,虽然这是对您现有代码的准确翻译,但我不确定它是否有用。无论输入如何,它总是计算 a dist1.0但是原始代码也是如此,所以我猜它是错误兼容的!


推荐阅读