Я довольно новичок в numpy. У меня есть следующий код, который дает мне желаемый результат:Как векторизовать цикл for, содержащий if-statement в 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 содержит для цикла, однако, и поэтому неловко медленно для больших входных векторов S. Может ли такая функция векторизовать в NumPy -синтаксис? Любая помощь будет оценена по достоинству.
Я был первым под впечатлением, что вся функция может быть векторизации всего три строки кода, но потом заметил, что 'k' меняется в цикле. Поскольку для вычисления K [j + 1] требуется знание K [j], существуют зависимости между итерациями, и цикл не может быть векторизован. По крайней мере, насколько мне известно. – DyZ
См. Это [ответ] (http://stackoverflow.com/a/41244906/2593236) по аналогичной проблеме. – pbreach
Если вы используете 'Python 2.x', замените' range' (список возврата) на 'xrange' (возвращает генератор) для значительного ускорения. – DerWeh