Мне нужно оцифровать следующее, чтобы код мог работать быстрее

Эта часть я смог векторизовать и избавиться от вложенного цикла.

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 = []
     for j in range(g):
         num = 0
         denom = 0
         for i in range(n):
             num = num + zijtpo[i][j]*obsdata[i]
             denom = denom + zijtpo[i][j]
         betajtpo_1.append(num/denom)

     betajtpo = np.asarray(betajtpo_1)

     return(pjtpo,betajtpo)

python,python-2.7,python-3.x,numpy,

0

Ответов: 1


0

Я предполагаю, что 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)

Пожалуйста, оставьте мне отзыв!

С Уважением,

Эрик Лафонтен

питон, питон-2,7, питон-3.x, NumPy,
Похожие вопросы