【发布时间】:2016-12-21 07:00:14
【问题描述】:
我对 numpy 还很陌生。我有以下代码,它给了我想要的结果:
import numpy as np
def get_result(S,K,delS):
res=np.zeros(S.shape[0],dtype=np.float64)
for j in range(res.shape[0]):
if S[j]-K>delS:
res[j]+=np.floor((S[j]-K)/delS)
K+=np.floor((S[j]-K)/delS)*delS
elif S[j]-K<-delS:
res[j]+=np.ceil((S[j]-K)/delS)
K+=np.ceil((S[j]-K)/delS)*delS
return res
S=np.array([1.0,1.05,1.1,1.12,1.09,1.14,1.21,1.6,1.05,1.0,0.95,0.90,0.87,0.77,0.63,0.85,0.91,0.76],dtype=np.float64)
K=1.0
delS=0.1
l=get_result(S,K,delS)
for j in range(S.shape[0]):
print("%d\t%.2f\t%.0f" % (j,S[j],l[j]))
然而,get_result 函数包含一个 for 循环,因此对于较大的输入向量 S 来说速度很慢。这样的函数可以用 numpy 语法向量化吗?任何帮助将不胜感激。
【问题讨论】:
-
我最初的印象是整个函数只需三行代码就可以向量化,但后来注意到
K在循环中发生了变化。由于计算 K[j+1] 需要 K[j] 的知识,因此迭代之间存在依赖关系,循环无法向量化。至少据我所知并非如此。 -
看到这个answer类似的问题。
-
如果您使用
Python 2.x将range(返回列表)替换为xrange(返回生成器)以显着提高速度。
标签: python numpy vectorization