2017-03-17 43 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>