2017-10-16 15 views
0

J'ai une configuration qui ressemble à ceci, et je rencontre des problèmes lorsque j'essaie d'appeler une fonction après avoir fait des calculs matriciels. Je voulais voir s'il y avait un moyen plus efficace de le faire:Python: TypeError: impossible de multiplier la séquence par un non-int de type 'float' et TypeError: un mauvais type d'opérande pour unary -: 'list', le moyen le plus propre de le coder?

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

Lorsque je tente de faire appel à function_7 et ajouter quelque chose à func7_list, je reçois cette erreur:

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

Lorsque je tente faire appel à function_5 et ajouter quelque chose à func5_list, je reçois cette erreur:

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

Je sais que ce doit être un problème avec la façon dont je générer les listes - j'ai essayé itérer les valeurs d'un de func5_list d func7_list appelle mes fonctions précédentes, mais ça ne marche pas non plus. Des suggestions sur comment appeler la fonction pour chaque valeur de var [1 ,:] ou var [2 ,:] et retourner une liste de sorties? Je vous remercie!

éditer: a résolu le problème. C'était avec l'appel d'une variable qui était déjà utilisée.

+0

var est une liste, non? – gautamaggarwal

+0

Il s'agit d'une liste avec des sorties matricielles. –

Répondre

0

J'ai fait quelques modifications dans votre code. Votre code a beaucoup de problèmes, y compris les indentations et la paranthésis manquante.

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

Vous avez dû mapper la fonction flottante sur la liste var, puis étendre les listes avec les sorties comme ci-dessus.

+0

Merci, cela aide ne pas donner une erreur. Cependant, il n'imprime pas func5_list ou func7_list correctement, comme ce que ces fonctions sont supposées renvoyer. Je voudrais qu'ils donnent des entrées au format: [[[0,0], [0, -func7]]] ou [[[0, x_func5], -x_func5], [0, y_func5]]]. Savez-vous comment faire cela? J'ai mis à jour mon premier article avec la façon dont je veux que la fonction appelle sur chaque sortie de la boucle for. –

+0

Lorsque je crée une nouvelle liste (func7_test) et que j'essaie d'ajouter comme ceci: func7_test.append (function_7 (func7_list)) Je reçois toujours les mêmes erreurs qu'avant. –

0

Essayez ce code ci-dessous. Il semble fonctionner très bien sur mon PC

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 

Sortie: [0,33333333333333304, -9,666666666666668, -0,666666666666667] [6,333333333333334, 11,333333333333334, 6,833333333333334]

+0

Désolé j'ai mis à jour ma première entrée, je veux quelque chose comme ceci, où la fonction agit sur chaque entrée de la boucle for: func7_list.append (function_7 (float (var [1 ,:]))). C'est là que je reçois les erreurs. –