Я предполагаю, что Python - это не ваш первый язык программирования, основанный на том, что я вижу. Причина, по которой я говорю это, заключается в том, что в python обычно нам не приходится иметь дело с манипулированием индексами. Вы действуете непосредственно по значению или возвращенному ключу. Не заставляйте это воспринимать как преступление, я делаю то же самое, что и сам C ++. Трудно удалить привычки;).
Если вы заинтересованы в производительности, у Raymond Hettinger есть хорошая презентация о том, что делать в Python, чтобы быть оптимизированным и красивым: https://www.youtube.com/watch?v=OSGv2VnC0go
Что касается кода, в котором вам нужна помощь, это поможет вам? Это, к сожалению, непроверено, поскольку мне нужно уйти ... ref: Итерирование по множеству numpy
http://docs.scipy.org/doc/numpy/reference/generated/numpy.true_divide.html
def EMalgofast(obsdata, beta, pjt):
n = np.shape(obsdata)[0]
g = np.shape(pjt)[0]
zijtpo = np.zeros(shape=(n,g))
for j in range(g):
zijtpo[:,j] = pjt[j]*stats.expon.pdf(obsdata,scale=beta[j])
zijdenom = np.sum(zijtpo, axis=1)
zijtpo = zijtpo/np.reshape(zijdenom, (n,1))
pjtpo = np.mean(zijtpo, axis=0)
betajtpo_1 = []
#manipulating an array of numerator and denominator instead of creating objects each iteration
num=np.zeros(shape=(g,1))
denom=np.zeros(shape=(g,1))
#generating the num and denom real value for the end result
for (x,y), value in numpy.ndenumerate(zijtpo):
num[x],denom[x] = num[x] + value *obsdata[y],denom[x] + value
#dividing all at once after instead of inside the loop
betajtpo_1= np.true_divide(num/denom)
betajtpo = np.asarray(betajtpo_1)
return(pjtpo,betajtpo)
Пожалуйста, оставьте мне отзыв!
С Уважением,
Эрик Лафонтен