2013-04-15 83 views
4

我已經定義下面的函數:TypeError:__getitem __()只需要2個參數(給出2個)TypeError? (Python 3中)

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算法。傳入的矩陣是一個使用元組作爲鍵來表示位置並作爲值浮動的字典。在塊(一個與A)的第一行

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

:此功能將正常工作約6次迭代,但我會得到一個。

我完全被這個困惑,因爲就像我說的,它可以正常工作約6次運行然後停止。

編輯:下面是一個創建的那種矩陣的我會通過在一個函數: (鑑於矩陣將爲每個迭代不同)

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

任何幫助,不勝感激! (P.S.第一篇文章在這裏)

+0

燁,元組的關鍵是字典。感謝您及時的回覆。我只是不明白它是如何工作6次,然後像這樣停止 – user2281223

+0

給出一個完整的例子是有幫助的 - 我們可以真正運行一個例子來測試(給我們一些顯示問題的示例數據)。 –

+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.]) 
相關問題