TypeError:__ getitem __()需要2个参数(给定2个)TypeError? (Python 3)

时间:2013-04-15 05:16:10

标签: python python-3.x typeerror

我定义了以下功能:

def eigval(matrix):
    a = matrix[0, 0]
    b = matrix[0, 1]
    c = matrix[1, 0]
    d = matrix[1, 1]
    c1 = (a + d) + sqrt((4 * b * c) + ((a - d)**2))
    c2 = (a + d) - sqrt((4 * b * c) + ((a - d)**2))
    return c1 / 2, c2 / 2

创建它是为了找到2×2矩阵的特征值。我用它来迭代地在矩阵上运行Jacobi算法。传入的矩阵是一个字典,它使用元组作为键来表示位置并浮动为值。这个函数可以在大约6次迭代中正常工作,但之后我会得到一个:

TypeError: __getitem__() takes exactly 2 arguments (2 given) 

在块的第一行(带有a的那一行)。

我对此完全感到困惑,因为就像我说的那样,大约6次运行然后就停止了。

编辑:这是一个创建我传递的矩阵的函数: (假设矩阵每次迭代都不同)

def create():
    matrix = {}
    matrix[0, 0] = 2
    matrix[0, 1] = 1
    matrix[1, 0] = 1
    matrix[1, 1] = 2
    return matrix

非常感谢任何帮助! (P.S.第一篇文章)

1 个答案:

答案 0 :(得分:1)

你的矩阵是一个使用元组作为键的字典,这可能不是你想要做的。

尝试使用嵌套列表:

from math import sqrt

def create():
    matrix = [[1, 2], [1, 2]]
    return matrix

def eigval(matrix):
    a = matrix[0][0]
    b = matrix[1][0]
    c = matrix[0][1]
    d = matrix[1][1]
    c1 = (a + d) + sqrt((4 * b * c) + ((a - d)**2))
    c2 = (a + d) - sqrt((4 * b * c) + ((a - d)**2))
    return [c1 / 2, c2 / 2]

>>> m = create() 
>>> eigval(m)
[3.0, 0.0]

或者使用numpy:

import numpy

def eigval(matrix):
    a = matrix[0, 0]
    b = matrix[1, 0]
    c = matrix[0, 1]
    d = matrix[1, 1]
    c1 = (a + d) + sqrt((4 * b * c) + ((a - d)**2))
    c2 = (a + d) - sqrt((4 * b * c) + ((a - d)**2))
    return numpy.array([c1 / 2, c2 / 2])

>>> m = numpy.array([[1, 2], [1, 2]])
>>> m
array([[1, 2],
       [1, 2]])
>>> eigvalues, eigvectors = numpy.linalg.eig(m)
>>> eigvalues
array([ 0.,  3.])

>>> eigval(m)
array([ 3.,  0.])