2013-04-25 2 views
0

Я хочу вычитать число из массива в python, но я хочу сохранить исходный массив.«resetting» variable in for loop python

Вот мой код:

for X0 in [X0 * 0.01 for X0 in range(-2,2)]: 
    for Y0 in [Y0 * 0.01 for Y0 in range(6,10)]: 
     RAm = RA 
     Decm = Dec 
     RAm[:] = [x - X0 for x in RAm] 
     Decm[:] = [x - Y0 for x in Decm] 
     RAs = np.sum(RAm) 
     Decs = np.sum(Decm) 
     #a = np.sqrt(((RAs**2*Decs**2)**2 - RAs**4*Decs**4)/(RAs**2*Decs**2*Decs**2 -Decs**2*RAs**4)) 
     #b = np.sqrt(((RAs**2*Decs**2)**2 - RAs**4*Decs**4)/(RAs**2*Decs**2*RAs**2 - RAs**2*Decs**4)) 
     print RA 
     print RAm 

Это дает мне, что РА меняется, даже если она должна оставаться такой же, потому что я хочу, чтобы вычитать другое число от RA каждый цикл. Как я могу это исправить?

+0

Вы смешиваете 'numpy.array' с регулярными 'list'? Если да, то почему? –

ответ

1

вместо itterating по списку, и внесение изменений в него, это сделать:

for element in list(your_list_here): 
    if element.something(): 
     your_list_here.remove(element) 

также .. назначение Ram=Ra означает, что каждый вызов метода на объектах, на самом деле относится к тому же объекту. Используйте Ram = list(Ra), если хотите быть в безопасности.

1

RAm = RA - RAm - псевдоним RA; RAm[:] = ... изменяет список на месте.

Вместо этого сделать просто

RAm = [x - X0 for x in RA] 
2

Если вы используете NumPy в любом случае, вы можете использовать тот факт, что он поддерживает операции на все элементы одновременно.

RAm = np.array(RA) - X0 
Decm = np.array(Dec) - Y0 

Или даже пропустить эти задания, если вы не используете результат для чего, кроме суммы:

RAs = np.sum(np.array(RA) - X0) 
Decs = np.sum(np.array(Dec) - Y0) 

Это мое впечатление, что вы (Python) начинающий, поэтому, возможно, придерживаться с базовым Python, пока вы не почувствуете себя комфортно с этим. Все это, конечно, может быть сделано без NumPy, а также:

RAs = sum(x - X0 for x in RA) 
Decs = sum(y - Y0 for y in Dec) 

Однако, если вы хотите использовать NumPy, правильно его использовать. Это означает: использовать матричные вычисления вместо циклов. Например, вы могли бы сделать что-то вроде этого *, чтобы получить array с суммами для различных значений Y0: только

Y0_values = np.array([Y0 * 0.01 for Y0 in range(6,10)]) 
y_matrix = np.tile(RA, [len(Y0_values), 1]) 
Y0_matrix = np.tile(Y0_values[np.newaxis].T, [1, len(RA)]) 
sums = np.sum(y_matrix - Y0_matrix, axis=1) 

* цели демонстрации. Я далек от эксперта NumPy, поэтому может быть еще лучший способ сделать это. По той же причине я не буду объяснять, как это работает; Я просто поощряю вас узнать больше о NumPy, в вашу пользу.