2017-03-17 37 views
1

我需要測試矩陣是否對稱。如果它是對稱的,函數需要返回0,否則返回1.對我來說,這段代碼是有意義的,但我不明白彈出的錯誤。循環矩陣元素時出現索引錯誤

IndexError        Traceback (most recent call last) 
<ipython-input-3-903eff7c516e> in <module>() 
    20 # here's the matrix I'm testing : 
    21 
---> 22 isSymmetric(np.matrix(([(1,0,0),(5,6,5),(8,0,1)]))) 

<ipython-input-3-903eff7c516e> in isSymmetric(A) 
    10  i=0 
    11  for i in np.matrix(A) : 
---> 12   m = A[i] 
    13   n = A[:,i] 
    14   if m==n : 

/usr/local/lib/python2.7/site-packages/numpy/matrixlib/defmatrix.pyc in __getitem__(self, index) 
    316 
    317   try: 
--> 318    out = N.ndarray.__getitem__(self, index) 
    319   finally: 
    320    self._getitem = False 

IndexError: index 5 is out of bounds for axis 0 with size 3 

這裏是我的代碼:

import numpy as np 

def isSymmetric (A) : 
    """ 
    A : the matrix that will be checked if it's symmetric 

    """ 

    #check if rows are same as columns 
    i=0 
    for i in np.matrix(A) : 
     m = A[i] 
     n = A[:,i] 
     if m==n : 
      print(1) 
     else: 
      print(0) 


# here's the matrix I'm testing : 

isSymmetric(np.matrix(([(1,0,0),(5,6,5),(8,0,1)]))) 
+1

http://stackoverflow.com/questions/5320324/testing-if-a-numpy-array-is-symmetric – ewcz

+0

您的代碼被錯誤地縮進,修復。 – Morgoth

+0

請將您的錯誤消息複製並粘貼到問題中,而不是使用圖像。它更具可讀性。 – Cecilia

回答

2

說實話有一堆東西你的代碼錯誤。你得到警告(和我的版本有一個徹底的錯誤)的原因是這樣的:

i=0 
for i in np.matrix(A) : 

這沒有任何意義。 for i in container將通過將i連續設置爲等於容器內的所有東西來循環。在這種情況下,容器是np.matrix(A),所以它循環遍歷數組中的每個實際項目。顯然,當你將它們用作索引時,這些沒有意義。如果你想循環索引,你需要類似的東西:

M = np.matrix(A) 
for i in range(M.shape[0]): 

這將遍歷矩陣的第一個索引的所有可能的值。

順便說,一個更加簡潔的方式來做到這一點是通過使用對稱矩陣的簡明的定義,即,轉置(M)= M。您可以在Python做到這一點爲:

def is_symmetric(M): 
    return (M == M.transpose()).all() 
+0

謝謝你的幫助,我是一名初學者程序員,所以我並不真正知道我在做什麼。此外,我試着更簡潔的代碼,我得到的錯誤「AttributeError:'列表'對象沒有屬性'轉置'」任何建議? – Katey

+0

@Katey是的,'轉置'是一種矩陣方法,所以你需要傳遞一個矩陣到那個函數。在您的代碼中,每次運行循環時都會將'A'轉換爲矩陣,效率非常低。如果將'A'轉換爲矩陣,並在必要時將其存儲在一個變量(例如'M')中,然後在其上執行循環,則會更好。 – Denziloe

+0

@Katey順便說一下,如果它幫助你找出問題,請接受這個答案。 – Denziloe

0

測試如果一個矩陣是對稱的,可以用np.all(A == A.T)之類的東西來完成。 A.T給人的轉置矩陣和==檢查equlity 的elementwise,如果對所有的元素,你的==後得到Truenp.all讓你最終知道,如果你的矩陣是對稱的,因此檢查。

但是,如果您使用的是浮點數,則有必要引入一些有限容差。 ==具有公差零點,當處理浮點時不總是很好。相反,您可以在這裏使用np.allclose(A, A.T)

這些方法返回TrueFalse。如果您想堅持使用10,則可以返回1 * <return value of np.all or np.allclose>