web-dev-qa-db-fra.com

TypeError: seuls les tableaux de longueur 1 peuvent être convertis en scalaires Python tout en essayant d'ajuster les données de manière exponentielle

f=np.loadtxt('Single Small Angle 1.txt',unpack=True,skiprows=2)
g=np.loadtxt('Single Small Angle 5.txt',unpack=True,skiprows=2)

x = f-g[:,:11944]
t=range(len(x))
m=math.log10(abs(x))

np.polyfit(t,m)

plt.plot(t,abs(x))
plt.show()

Je ne sais tout simplement pas comment résoudre mon problème. Il n'arrête pas de dire:

m=math.log10(abs(x))
TypeError: only length-1 arrays can be converted to Python scalars
69
user3291404

Les fonctions non numériques telles que math.abs() ou math.log10() ne fonctionnent pas correctement avec les tableaux numpy. Il suffit de remplacer la ligne qui génère une erreur avec:

m = np.log10(np.abs(x))

En dehors de cela, l'appel np.polyfit() ne fonctionnera pas car il manque un paramètre (et vous n'affectez pas le résultat pour une utilisation ultérieure de toute façon).

93
Tom Pohl

Voici un autre moyen de reproduire cette erreur en Python2.7 avec numpy:

import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.concatenate(a,b)   #note the lack of Tuple format for a and b
print(c) 

La méthode np.concatenate génère une erreur:

TypeError: only length-1 arrays can be converted to Python scalars

Si vous lisez la documentation autour de numpy.concatenate , alors vous vous attendez à ce qu'il attende un nuage d'objets numpy. Donc entourant les variables avec des parenthèses corrigé:

import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.concatenate((a,b))  #surround a and b with parens, packaging them as a Tuple
print(c) 

Ensuite, il imprime:

[1 2 3 4 5 6]

Que se passe-t-il ici?

Cette erreur est un cas d'implémentation en bulle - elle est causée par la philosophie de typage de canard de python. Il s’agit d’une erreur de bas niveau cryptique python vomir quand elle reçoit des types de variables inattendus, tente de s’exécuter et fait quelque chose, s’achève, les pukes, tente une action corrective, échoue, puis indique vous que "vous ne pouvez pas reformuler les réponses du sous-espace lorsque le vent souffle de l'est mardi".

Dans des langages plus sensibles comme C++ ou Java, il vous aurait dit: "vous ne pouvez pas utiliser un TypeA alors que TypeB était attendu". Mais Python fait de son mieux pour persévérer, fait quelque chose d'indéfini, échoue, puis vous restitue une erreur inutile. Le fait que nous devions en discuter est l'une des raisons pour lesquelles je n'aime pas Python, ni sa philosophie de typage des canards.

61
Eric Leschinski