如何解决用numpy快速将按行子矩阵相乘
随着时间的推移,我有一些实验数据,在某种意义上,我需要打折,因为每个数据点的权重取决于其时差。 为此,我有以下代码
import numpy as np
n_spots = 20
n_times = 5000
data = np.random.random((n_times,n_spots))
rate = 0.9
weight_vec = rate ** (n_times - 1 - np.arange(1,n_times,1))
result = np.zeros((n_times,n_spots))
for k in range(n_times):
result[k,:] = data[0:k,].transpose().dot(weight_vec[n_times - 1 - k:n_times - 1])
随着n_times
的增加,for循环变得非常慢,我想知道是否有一种方法可以对此进行优化甚至完全消除for循环。在相似的情况下,可以添加新轴并以更高的维度作为矩阵乘积执行计算,但是在data
的子数组大小不相等的情况下,我很难做到这一点。
解决方法
您将在每一步中为当前结果添加一栏,并累积您的计算量,因此np.cumsum
是一个不错的选择:
cols = data[:n_times-1].transpose() * weight_vec
result = np.cumsum(cols,axis=1)
result = np.insert(result.transpose(),values=0,axis=0)
result
的第一行包含零,因此我做了其他插入。而且,weight_vec
的计算本身可以进行改进:
weight_vec = np.full(n_times - 1,fill_value = 0.9)
weight_vec[0] = 1
weight_vec = np.cumprod(weight_vec)[::-1]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。