用矢量化双重求和的Pythonic方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了用矢量化双重求和的Pythonic方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1165字,纯文字阅读大概需要2分钟。
内容图文
![用矢量化双重求和的Pythonic方法](/upload/InfoBanner/zyjiaocheng/687/5c929fe70c8e4a6ca7b2eb9fb65a4abb.jpg)
我正在尝试将双重求和公式转换为代码,但无法找出正确的矩阵/矢量表示形式.
第一个求和是i到n,第二个求和是j>它在.
我想这里有一个效率更高的& pythonic的编写方式?
我求助于嵌套循环,以使其正常工作,但正如预期的那样,它在大型数据集下运行非常缓慢:
def wapc_denom(weights, vols):
x = []
y = []
for i, wi in enumerate(weights):
for j, wj in enumerate(weights):
if j > i:
x.append(wi * wj * vols[i] * vols[j])
y.append(np.sum(x))
return np.sum(y)
编辑:
使用smci答案的指导,我认为我有一个潜在的解决方案:
def wapc_denom2(weights, vols):
return np.sum(np.tril(np.outer(weights, vols.T)**2, k=-1))
解决方法:
假设您只希望对每一项进行计数(为此您必须将x = []移到外循环中),一种便宜的计算总和的方法是
创建模拟数据
weights = np.random.random(10)
vols = np.random.random(10)
做计算
wv = weights * vols
result = (wv.sum()**2 - wv@wv) / 2
检查是否相同
def wapc_denom(weights, vols):
y = []
for i, wi in enumerate(weights):
x = []
for j, wj in enumerate(weights):
if j > i:
x.append(wi * wj * vols[i] * vols[j])
y.append(np.sum(x))
return np.sum(y)
assert np.allclose(result, wapc_denom(weights, vols))
为什么行得通?
我们正在做的是计算完整矩阵的总和,减去对角线并除以二.这很便宜,因为很容易验证外部乘积的总和是否是总和的乘积.
内容总结
以上是互联网集市为您收集整理的用矢量化双重求和的Pythonic方法全部内容,希望文章能够帮你解决用矢量化双重求和的Pythonic方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。