Как обновить Inital Arrays с помощью Numpy - PullRequest
0 голосов
/ 08 февраля 2019

(python 2) У меня есть этот код, который принимает мои массивы, x1, y1, z1, vx1, vy1, vz1, и работает с ними (это основная часть кода), и в конце я осталсяс новыми массивами x2, y2, z2, vx2, vy2, vz2.То, что я хочу сделать, это выяснить, как зацикливать весь код, но обновлять x1, y1, ... и т. Д. С x2, y2, ... давая мне x3, y3 .... и т. Д., Пока у меня не появится xn, yn,... и т. д.

Я пытался сделать это с помощью

 for timestep in xrange(0,1000):

, но это просто запускает всю программу 1000 раз, давая мне x2, y2, ... 1000 раз.Кроме того, это действительно медленно.Однако я хочу получить x1000, y1000, .... желательно с использованием Numpy, чтобы мой код также выполнялся быстрее.

#x1,y1,z1,vx1,vy1,vz1,mass1,and n1 are all arrays with npoints elements

for timestep in xrange(0,1000):     
     M = np.zeros((npoints,npoints))

     def do_work(xn, step):

         #Not my actual function, but to give you an idea
         M[xn,step] = x1[step]+y1[step]+z1[step]+x1[xn]+y[xn]+z[xn]

     #the rest of this is all just more code to create my new arrays.
     [do_work(xn, step) for (xn,step) in itertools.product(xrange(npoints), xrange(npoints))]



     a=[np.sum(arr) for arr in M]


     a = np.array(a)
     vxx = np.array(vx1)
     vyy=np.array(vy1)
     vzz=np.array(vz1)
     vx=vxx[0:npoints]
     vy=vyy[0:npoints]
     vz=vzz[0:npoints]

     vx2 = vx + (a +a)/2  * dt
     vy2 = vy + (a +a)/2  * dt
     vz2 = vz + (a+a)/2   * dt

     xx = np.array(x1)
     yy = np.array(y1)
     zz = np.array(z1)

     x=xx[0:npoints]
     y=yy[0:npoints]
     z=zz[0:npoints]


     x2= (x+vx2*dt) + (a*dt**2)/2
     y2= (y+vy2*dt) + (a*dt**2)/2
     z2= (z+vz2*dt) + (a*dt**2)/2


#plotting and printing 


#print x1
#plt.scatter(x2,y2)

plt.show()

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Ваша проблема в том, что вы перезаписываете x2, etc на каждой итерации.Я предлагаю только вычислять ваши дельты в цикле и добавлять их либо в x1, etc, либо создавать копию x1, etc перед циклом, например, как x_final, etc, и суммировать ваши дельты в кумулятивном цикле.

#x1,y1,z1,vx1,vy1,vz1,mass1,and n1 are all arrays with npoints elements

#x_final, y_final as copy

for timestep in xrange(0,1000): 
    # do your calculations

    x_final = x_final + dx



0 голосов
/ 08 февраля 2019

для временного шага в xrange (0,1000):
M = np.zeros ((npoints, npoints))

В начале кода выше инициализируется M каждыедля цикла итерации.Чтобы избежать этого, поместите M вне цикла for, если вы намереваетесь написать в него свой ответ.

Подумайте об использовании перечисления, чтобы перейти к тому, что вы хотите вычислить.Я считаю его полезным, поскольку он обеспечивает доступ к индексу, на котором вы находитесь, что полезно для вычисления предыдущих и текущих временных шагов.

См. Этот пост переполнения стека: Как перебрать 1d массив NumPy с индексоми значение

Примером этой конструкции, которую вы будете использовать:

npoints = 1000
M = np.zeros((npoints,npoints))

def add_to_number(prev_num):
    new_num = prev_num + 1
    return new_num

for i, row in enumerate(M[0:-1]):
    # this is a row slice of M
    for j, value in enumerate(row[0:-1]):
        # this is a value slice of the above row
        # having position i, j
        M[i+1, j+1] = add_to_number(value)

, вы увидите, что она будет проходить через M строка за строкой, значение за значением и добавлять числа вдольМ. Надеюсь, это поможет!

0 голосов
/ 08 февраля 2019

Если вам не нужны все x2, y2, z2, x3, ... в памяти в конце, вы можете добавить несколько строк в конце

x1 = x2
y1 = y2
z1 = z2

Таким образом,во втором проходе цикла вы будете обновлять значения X1, Y1, Z1 в качестве входных данных, и вы просто будете записывать поверх x2, y2, z2 с (что бы вы ни считали) x3, y3, z3.Эти ребята загружаются в x1, y1, z1 и цикл продолжается.

Если вам нужны все промежуточные значения x, y и z, возможно, стоит напечатать их в файл на каждом шаге, чтобы вы могли получить к ним доступпозже.

...