2014-02-22 40 views
1

我在使用python for循環時遇到了一些麻煩。我的目標是遍歷一組數據並對每個元素執行算術運算。下面是一個例子循環與大容量算術

import numpy as np 

X = np.array([[6.3, 7.4, 4.2], [2.6, 7.8, 9.1], [1.7, 3.9, 6.4]]) 
A = B = np.zeros((len(X), len(X))) 

# Method One 
for i in range(len(X)): 
    for j in range(len(X)): 
     A[i][j] = X[i][j] + 2 * 5 
     B[i][j] = X[i][j] + 8 

# Method Two 
A2 = X + 2 * 5 
B2 = X + 8 

print "A" 
print A 
print A2 
print A == A2 
print "B" 
print B 
print B2 
print B == B2 

方法一: 這裏的想法是,我會循環 通過每個元素

方法二: 這種方式,可以一次全部

的原因做我不只是使用方法2,因爲對於某些值,我想執行不同的操作,所以我的想法是使用for循環並在執行操作之前檢查每個值。我只是很困惑,爲什麼這兩種方法產生不同的結果。

如果我切換第9/10行,則結果 被翻轉。

+0

你是什麼意思11/12行?第11行和第12行是空行和「#方法二」。 –

+0

對不起,這是一個錯字。如果您切換for循環中完成的操作順序,則答案會更改。 – eitanlees

回答

4

這行不使兩個單獨的陣列AB,它使一個陣列,使兩個名字,A,和B,指的是陣列:

A = B = np.zeros((len(X), len(X))) 

例如:

>>> A = B = np.zeros((3,3)) 
>>> A is B 
True 
>>> A[0,0] = 99 
>>> A 
array([[ 99., 0., 0.], 
     [ 0., 0., 0.], 
     [ 0., 0., 0.]]) 
>>> B 
array([[ 99., 0., 0.], 
     [ 0., 0., 0.], 
     [ 0., 0., 0.]]) 

因此,在這些行:

A[i][j] = X[i][j] + 2 * 5 
    B[i][j] = X[i][j] + 8 

你也可以寫下

A[i][j] = X[i][j] + 2 * 5 
    A[i][j] = X[i][j] + 8 

這就是爲什麼順序很重要;他們都在設置同一個陣列的同一個單元,所以最後一個是你看到的那個。

0

您需要創建兩個數組:不是

A = B = np.zeros((len(X), len(X))) 

A = np.zeros((len(X), len(X))) 
B = np.zeros((len(X), len(X))) 

您將創建兩個變量,其指向同一個對象 - 所以無論你做的最後一件事,那就是你得到...在Python中,表達式

A = B 

意思是「從現在開始,當我說'A'時,我真的意思是'B'「。當你來自Matlab時,感到困惑......