【发布时间】:2016-06-04 01:34:43
【问题描述】:
我目前正在计算一个包含对索引求和的函数。索引在0和T的整数部分之间;理想情况下,我希望能够快速计算 T 的几个值的总和。 在现实生活中,T 的大部分值都很小,但有一小部分可能比平均值大一到两个数量级。
我现在做的是:
1)我定义了向量T,例如(我的真实数据有更多的条目,只是提供一个想法):
import numpy as np
T = np.random.exponential(5, 10)
2) 我创建了一个矩阵,其中包含 0 和 int(T) 之间的因子,然后归零:
n = int(T.max())
j = ((np.arange(n) < T[:,np.newaxis])*np.arange(1,n+1)).astype(int).transpose()
print(j)
[[ 1 1 1 1 1 1 1 1 1 1]
[ 2 0 2 2 2 0 2 0 2 2]
[ 0 0 3 0 3 0 3 0 3 3]
[ 0 0 4 0 4 0 0 0 4 4]
[ 0 0 5 0 5 0 0 0 5 5]
[ 0 0 6 0 6 0 0 0 6 6]
[ 0 0 7 0 7 0 0 0 0 7]
[ 0 0 8 0 8 0 0 0 0 8]
[ 0 0 9 0 9 0 0 0 0 9]
[ 0 0 0 0 10 0 0 0 0 10]
[ 0 0 0 0 11 0 0 0 0 0]
[0 0 0 0 12 0 0 0 0 0]]
3) 我生成求和的单个元素,使用掩码避免将函数应用于零元素:
A = np.log(1 + (1 + j) * 5)* (j>0)
4) 我沿列求和:
A.sum(axis=0)
获得: 数组([ 5.170484 , 2.39789527, 29.96464821, 5.170484 , 42.29052851、2.39789527、8.21500643、2.39789527、 18.49060911, 33.9899999])
有没有最快/更好的方法来矢量化它?我觉得它很慢,因为大量的零对总和没有贡献,但由于我是 NumPy 的初学者,我想不出更好的编写方法。
编辑:在我的实际问题中,应用于 j 的函数还取决于第二个参数 tau(在与 T 大小相同的向量中)。所以每一列包含的项目都不一样。
【问题讨论】:
-
您能否添加一些涉及
tau的代表性示例案例以更详细地解释您的编辑?此外,对于以后的帖子,请使用代表实际案例的示例案例。
标签: python arrays performance numpy vectorization