我可以避免为同一操作 (Python) 循环遍历向量吗?

Can I avoid a looping through a vector for the same operation (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 个元素。 难道不能对其进行矢量化吗?

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

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)

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