/ / Премахване на вложени контури в рамките на python - python, numpy, nested-loops

Премахване на вложени циркуляри в Python - python, numpy, nested-loops

Опитвам се да ускоря кода си. Най-големият проблем са няколко вложени контура, които имам (те трябва да повторят над 25000 клетки). Въпреки това, когато се опитвам да се отърва от тези вложени контури, получавам различен резултат и не изглежда да разбирам защо.

Това е една от вложената линия:

for i in range(N):
for j in range(N):
# value added in sector i (month k+1)
VA[i,k+1]= VA[i,k+1] - IO[j,i]*(Produc[i,k+1]/Produc[i,0])

Това е, което направих, за да се отърва от вътрешния цикъл:

for in range(N):
VA[i,k+1]=VA[i,k+1] - np.sum(IO[:,i])*(Produc[i,k+1]/Produc[i,0])

Благодаря ви за помощта.

Отговори:

1 за отговор № 1

Проблемът е, че присвояването на VA ограничава типа до VA.dtype, така че можете да загубите точност, ако VA.dtype е по-малко точен от резултата от VA[i,k+1] - IO[j,i]*(Produc[i,k+1]/Produc[i,0]).

За да запазите това закръгляване, искате:

for i in range(N):
# value added in sector i (month k+1)
VA[i,k+1] -= (IO[:,i]*(Produc[i,k+1]/Produc[i,0])).astype(VA.dtype).sum()

... ако приемем, че не сте по-доволни от по-точната версия!

Някои по-старателни изследвания показват, че акоизважданията вземат данните през 0, поведението не е "идеално емулирано. Не бих се притеснил, защото подражаването на фините бъгове е загуба на време;).


Обърнете внимание, че ако сте доволни

for in range(N):
VA[i,k+1]=VA[i,k+1] - np.sum(IO[:,i])*(Produc[i,k+1]/Produc[i,0])

можете да го направите

VA[:,k+1] -= IO.sum(axis=0) * Produc[:,k+1] / Produc[:,0]

което според мен е еквивалентно.


Имайте предвид, че това предполага това N е идеалното място за много от тях. Може да е така VA[:N, :N] е подмножество на VA, в който случай това е проблемът и трябва да изрежете всичко N в рамките на изчисленията.