python - 我可以避免循环遍历同一操作的向量(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 的广播几乎可以处理你的循环所做的所有事情。您需要的唯一特殊行为是在计算and值时numpy.sum
使用参数,因为您不想一次对所有轴求和(因为这会给您一个标量,而不是一个向量)。axis
freq_a
freq_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 dist
。1.0
但是原始代码也是如此,所以我猜它是错误兼容的!
推荐阅读
- swift - 隐藏默认初始值设定项参数名称
- python-3.x - Python 3 AttributeError:模块'sys'没有属性'argv'
- vue.js - 尝试在 nuxt 项目中安装外部 javascript 库(choreographer-js),但它不起作用
- c#-3.0 - 如何将 csharp 8 代码转换为早期版本
- ios - iOS 如何正确使用 simd_float3?
- scala - 在火花中将大型 DataFrame 保存为 json
- reactjs - 在 react js 中使用 api 从邮政编码自动填充州和城市
- python - 对于循环网络抓取网站会引发 timeouterror、newconnectionerror 和 requests.exceptions.ConnectionError
- reactjs - Child 组件的 props 不执行
- javascript - graphiql 上的查询请求