2017-10-16 59 views
0

我有一個看起來像這樣的設置,當我嘗試在做一些矩陣數學後調用函數時遇到了一些問題。我想看看是否有這樣做更有效的方式:Python:TypeError:無法通過類型'float'的非int類型和TypeError:一元操作數類型錯誤 - :'list',最簡潔的方式來編碼?

#Define functions 
    def function_7(func_7): 
     func_7 = [] 
     func_7.append([ [ [0,0], [0, -func7] ] ]) 
     return func7_ 

    def function_5(func_5): 
     func_5 = [] 
     slope_func5 = 1/math.sqrt(3) 
     theta = math.atan(slope_func5) 
     x_func5 = func_5*math.cos(theta) 
     y_func5 = func_5*math.sin(theta) 
     func_5.append([ [[0, x_func5], [0, y_func5]], [[0, -x_func5], [0, y_func5]] ]) 
     return func_5_ 

    func5_list = [] 
    func7_list = [] 

    #Set up matrix here 
    my_list = (0, 10, 1) 

    for i in my_list: 
     A = np.matrix([[0, 0, 1, 1, 0, 0], 
         [1, 1, 0, 0, 0, 0], 
         [2, 0, 0, 1, 0, 0], 
         [0, 0, 0, 0, 1.5, 1.5], 
         [3, 0, 0, 0, 0, 1.5], 
         [0, 0, 0, 0, 0, 1] 
     B = lambda i: np.matrix([[3], [8], [6], [12], [5], [i]]) 
     var = np.linalg.solve(A, B(i)) 

     func7_list.append(function_7(float(var[1,:])) 
     func5_list.append(function_5(float(var[2,:])) 

當我嘗試在function_7調用並追加的東西func7_list,我得到這個錯誤:

TypeError: bad operand type for unary -: 'list' 

當我嘗試對function_5調用並追加的東西func5_list,我得到這個錯誤:

TypeError: can't multiply sequence by non-int of type 'float' 

我知道它必須與我是如何生成的列表的一個問題 - 我試圖通過func5_list的值迭代d func7_list在那裏調用我早期的函數,但那也不起作用。有關如何爲var [1 ,:]或var [2,:]的每個值調用函數並返回輸出列表的任何建議?謝謝!

編輯:找出問題所在。這是在調用一個已經被使用的變量。

+0

var是一個清單,對不對? – gautamaggarwal

+0

這是一個帶有矩陣輸出的列表。 –

回答

0

我在你的代碼中做了一些修改。你的代碼有很多問題,包括縮進和缺少paranthesis。

def function_7(func_7): 
    func_7 = [] 
    func_7.append([ [ [0,0], [0, -func7] ] ]) 
    return func7 

def function_5(func_5): 
    func_5 = [] 
    slope_func5 = 1/math.sqrt(3) 
    theta = math.atan(slope_func5) 
    x_func5 = func_5*math.cos(theta) 
    y_func5 = func_5*math.sin(theta) 
    func_5.append([ [[0, x_func5], [0, y_func5]], [[0, -x_func5], [0, y_func5]] ]) 
    return func_5 

func5_list = [] 
func7_list = [] 

#Set up matrix here 
my_list = (0, 10, 1) 

for i in my_list: 
    A = np.matrix([[0, 0, 1, 1, 0, 0], 
        [1, 1, 0, 0, 0, 0], 
        [2, 0, 0, 1, 0, 0], 
        [0, 0, 0, 0, 1.5, 1.5], 
        [3, 0, 0, 0, 0, 1.5], 
        [0, 0, 0, 0, 0, 1]]) 
    B = lambda i: np.matrix([[3], [8], [6], [12], [5], [i]]) 
    var = np.linalg.solve(A, B(i)) 
    func7_list.extend(map(float, var[1:])) 
    func5_list.extend(map(float, var[2:])) 

您需要在var列表上映射float函數,然後使用上面的輸出擴展列表。

+0

謝謝,這有助於不會給出錯誤。但是,它不會正確地打印出func5_list或func7_list,就像這些函數應該返回的那樣。 我希望他們給出格式爲[[[0,0],[0,-func7]]]或[[[0,x_func5],[0,y_func5]],[[0, -x_func5],[0,y_func5]]]。你知道怎麼做嗎?我已經更新了我的第一篇文章,內容是如何讓函數調用for循環的每個輸出。 –

+0

當我創建一個新列表(func7_test)並嘗試像這樣追加:func7_test.append(function_7(func7_list))我仍然得到與以前相同的錯誤。 –

0

試試以下代碼。看來我的電腦上工作正常

import numpy as np 
#Define functions 
def function_7(func_7): 
    func_7 = [] 
    func_7.append([ [ [0,0], [0, -func7] ] ]) 
    return func7 

def function_5(func_5): 
    func_5 = [] 
    slope_func5 = 1/math.sqrt(3) 
    theta = math.atan(slope_func5) 
    x_func5 = func_5*math.cos(theta) 
    y_func5 = func_5*math.sin(theta) 
    func_5.append([ [[0, x_func5], [0, y_func5]], [[0, -x_func5], [0, y_func5]] ]) 
    return func_5 

func5_list = [] 
func7_list = [] 

#Set up matrix here 
my_list = (0, 10, 1) 

for i in my_list: 
    A = np.matrix([[0, 0, 1, 1, 0, 0], 
        [1, 1, 0, 0, 0, 0], 
        [2, 0, 0, 1, 0, 0], 
        [0, 0, 0, 0, 1.5, 1.5], 
        [3, 0, 0, 0, 0, 1.5], 
        [0, 0, 0, 0, 0, 1]]) 
    B = lambda i: np.matrix([[3], [8], [6], [12], [5], [i]]) 
    #print B(i) 
    var = np.linalg.solve(A, B(i)) 
    #print var 
    func7_list.append(float(var[1,:])) 
    func5_list.append(float(var[2,:])) 
print func5_list 
print func7_list 

輸出: [0.33333333333333304,-9.666666666666668,-0.666666666666667] [6.333333333333334,11.333333333333334,6.833333333333334]

+0

對不起,我已經更新了我的第一個條目,我其實想要類似這樣的東西,其中函數作用於for循環的每個條目:func7_list.append(function_7(float(var [1 ,:])))。這是我得到錯誤的地方。 –

相關問題