Numpy 如何矢量化 python 函数使用 np.cumprod
Numpy how to vectorize python function use np.cumprod
我有一个python函数:
pval = np.array([1,1,1,1,1,0.999709, 0.99973,0.999743,0.999706, 0.999675, 0.99965, 0.999629])
age1=4
age2=8
def getnpxtocert(mt, age, age2):
val = mt[age]
for i in range(age + 1,age2):
val = val * mt[i]
return val
getnpxtocertv(pval,age1,age2)
输出为:
0.9991822227268075
然后我尝试使用 cumprod 对其进行矢量化:
def getnpxtocertv(mt, age, age2):
return (mt[age]*np.cumprod(mt[age+1:age2])).sum()
getnpxtocert(pval,age1,age2)
但输出是:
2.998330301296807
我哪里做错了?有哪位朋友可以帮忙吗?
您不需要 cumprod
和 sum
。只需使用 prod
:
def getnpxtocert_v2(mt, age, age2):
return np.prod(mt[age:age2])
比较:
In [23]: getnpxtocert(pval, age1, age2)
Out[23]: 0.9991822227268075
In [24]: getnpxtocert_v2(pval, age1, age2)
Out[24]: 0.9991822227268075
cumprod
接受一个数组 [x0, x1, x2, ...]
和 returns 一个包含 [x0, x0*x1, x0*x1*x2, ...]
的相同长度的数组。 prod
returns 所有元素乘积的标量 x0*x1*x2*...
。
我有一个python函数:
pval = np.array([1,1,1,1,1,0.999709, 0.99973,0.999743,0.999706, 0.999675, 0.99965, 0.999629])
age1=4
age2=8
def getnpxtocert(mt, age, age2):
val = mt[age]
for i in range(age + 1,age2):
val = val * mt[i]
return val
getnpxtocertv(pval,age1,age2)
输出为:
0.9991822227268075
然后我尝试使用 cumprod 对其进行矢量化:
def getnpxtocertv(mt, age, age2):
return (mt[age]*np.cumprod(mt[age+1:age2])).sum()
getnpxtocert(pval,age1,age2)
但输出是:
2.998330301296807
我哪里做错了?有哪位朋友可以帮忙吗?
您不需要 cumprod
和 sum
。只需使用 prod
:
def getnpxtocert_v2(mt, age, age2):
return np.prod(mt[age:age2])
比较:
In [23]: getnpxtocert(pval, age1, age2)
Out[23]: 0.9991822227268075
In [24]: getnpxtocert_v2(pval, age1, age2)
Out[24]: 0.9991822227268075
cumprod
接受一个数组 [x0, x1, x2, ...]
和 returns 一个包含 [x0, x0*x1, x0*x1*x2, ...]
的相同长度的数组。 prod
returns 所有元素乘积的标量 x0*x1*x2*...
。