我可以避免为同一操作 (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_a
和 freq_b
值时使用 numpy.sum
和 axis
参数,因为您不想对所有轴求和一次(因为那样会给你一个标量,而不是向量)。
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.0
的 dist
。但是原始代码也是如此,所以我猜它是 bug 兼容的!
我有一个向量,必须对向量的每个元素进行相同的计算。它是需要给定值频率的分类数据的相似性度量。在这种情况下,我想计算 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_a
和 freq_b
值时使用 numpy.sum
和 axis
参数,因为您不想对所有轴求和一次(因为那样会给你一个标量,而不是向量)。
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.0
的 dist
。但是原始代码也是如此,所以我猜它是 bug 兼容的!