【问题标题】:Index error when looping through matrix elements遍历矩阵元素时的索引错误
【发布时间】:2017-03-17 20:03:47
【问题描述】:

我需要测试一个矩阵是否对称。如果是对称的,该函数需要返回 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)])))

【问题讨论】:

  • 您的代码缩进不正确,修复它。
  • 请将您的错误消息复制并粘贴到您的问题中,而不是使用图像。它更具可读性。
  • 我已经为您进行了编辑。我改变的一件事是你的头衔。原因是您遇到的问题并非特定于对称矩阵或测试对称矩阵。这是如何索引矩阵的问题。这也是错误消息告诉您的内容。新标题将帮助有相同问题的其他人找到您的问题。

标签: python python-3.x matrix


【解决方案1】:

说实话,您的代码有很多问题。你收到警告的原因(我的版本有一个彻底的错误)是这样的:

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]):

这将遍历矩阵第一个索引的所有可能值。

顺便说一下,一个更简洁的方法是使用对称矩阵的简洁定义,即 transpose(M) = M。您可以在 Python 中这样做:

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

【讨论】:

  • 感谢您的帮助,我是一名初级程序员,所以我真的不知道自己在做什么。另外,我尝试了更简洁的代码,但收到错误“AttributeError:'list' object has no attribute 'transpose'”有什么建议吗?
  • @Katey 是的,transpose 是一种矩阵方法,因此您需要将矩阵传递给该函数。在您的代码中,您每次运行循环时都将A 转换为矩阵,这是非常低效的。最好将A 转换为矩阵,必要时将其存储在变量中(例如M),然后对其执行循环。
  • @Katey 顺便说一句,如果它帮助您解决问题,请接受这个答案。
【解决方案2】:

使用np.all(A == A.T) 之类的方法来测试矩阵是否对称。 A.T 给出转置矩阵,== 检查相等性elementwise,因此检查是否所有元素都得到True 和np.all 在== 之后让你最终知道你的矩阵是否是对称的。

但是,如果您使用的是浮点数,那么引入一些有限容差会很有用。 == 的容差为零,这在处理浮点数时并不总是好的。相反,您可以在此处使用np.allclose(A, A.T)。

这些方法返回True 或False。如果您想坚持使用1 和0,可以返回1 * &lt;return value of np.all or np.allclose&gt;。

【讨论】:

    猜你喜欢
    • 2017-08-04
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    相关资源
    最近更新 更多