Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Pourquoi j'obtiens "TypeError: only length-1 arrays can be converted to Python scalars" ?

+3 votes

J'essaye de visualiser une fonction complexe en renvoyant son module (qui est donc un scalaire). Je dispose de trois axes, un pour les réels, un pour les imaginaires et l'axe des couleurs pour le module. Cela ne devrait pas poser de problème, voici mon programme :

from fonctions import*
from matplotlib.pyplot import*
from numpy import*

def f(x,y):
    z=complex(x,y)
    return module(z**2-3*z+cos(z))

x,y = meshgrid(linspace(-10,10,100),linspace(-10,10,100))
z = f(x,y)

graphe = contourf(x,y,z,500)
colorbar()

show()

Pourtant j'obtiens

`Traceback (most recent call last):
  File "C:/Python34/FonctionsComplexes.py", line 10, in <module>
    z = f(x,y)
  File "C:/Python34/FonctionsComplexes.py", line 6, in f
    z=complex(x,y)
TypeError: only length-1 arrays can be converted to Python scalars`

Pouvez-vous m'aider ?

demandé 17-Aou-2015 par anonyme
edité 17-Aou-2015 par max

2 Réponses

+4 votes

Le problème vient du fait que ta fonction f n'accepte que des nombres alors que tu lui passe (ligne 9) deux tableaux numpy.

L'objet complexe de python n'est pas prévu pour accepter des tableaux numpy.

Deux solutions donc. Soit tu change ta fonction f par une fonction équivalente capable de traiter les tableaux de nombres. Quelques choses comme :

def f(x,y):
    z = x + 1j * y
    return abs(z**2-3*z*cos(z))

l'autre solution est de transformer ta fonction avec numpy.vectorize ce qui revient à dire "ma fonction travaille sur chaque éléments des tableaux indépendamment" :

vect_f = vectorize(f)
z = vect_f(x,y)

enfin évite de tout importer avec *. Surtout avec numpy qui a beaucoup de fonctions qui ont des noms comme ceux fournit par python.

répondu 17-Aou-2015 par Kje (464 points)
edité 20-Aou-2015 par Kje

Attention, vectorize c'est lent. La première solution est de loin la meilleure.

0 votes

Un indice: x.ndim
Une solution: x.flatten()

répondu 17-Aou-2015 par joshuafr (124 points)

Je suis pas sûrs de comprendre la solution... flatten ne changera rien au fait que sa fonction utilise complex qui est incapable de travailler avec un array

...