TypeError: Nur Arrays der Länge 1 können in Python-Skalare konvertiert werden, während versucht wird, Daten exponentiell anzupassen

76
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()

Ich bin mir nur nicht sicher, wie ich mein Problem beheben soll. Es heißt immer wieder:

m=math.log10(abs(x))
TypeError: only length-1 arrays can be converted to Python scalars
user3291404
quelle
18
Wenn Sie eine native Python-Liste wie [1,2,3] einer numpy-Methode zuführen, die ein numpy-Array erwartet, wird dieser Fehler angezeigt. Diese Numpy-Methode nimmt Ihre native Python-Liste und versucht, sie zu verdauen, und tief im Inneren wird diese Antwort verstärkt. Eine benutzerfreundlichere Fehlermeldung wäre gewesen: TypeError: Don't feed native python lists into numpy functions that expect numpy arrays. Either convert your python list to a numpy array or package your python lists into a tuple. Python Numpy hat den Ball wirklich auf diesen fallen lassen, diese Fehlermeldung ist schrecklich.
Eric Leschinski

Antworten:

100

Nicht-Numpy-Funktionen mögen math.abs()oder math.log10()spielen nicht gut mit Numpy-Arrays. Ersetzen Sie einfach die fehlerhafte Zeile durch:

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

Abgesehen davon np.polyfit()funktioniert der Aufruf nicht, da ein Parameter fehlt (und Sie das Ergebnis sowieso nicht zur weiteren Verwendung zuweisen).

Tom Pohl
quelle
1
Gute Antwort. Darüber hinaus denke ich, dass keine der mathematischen Funktionen mit Numpy-Arrays funktioniert. Ändern Sie sie besser mit numpy Funktionen.
Endertunc
Danke vielmals! Ich hatte ein ähnliches Problem mit math.power in Kombination mit anderen Numpy-Funktionen. Das Ersetzen von math.power durch numpy.power löste das Problem.
Aurgho Bhattacharjee
65

Hier ist eine andere Möglichkeit, diesen Fehler in Python2.7 mit numpy zu reproduzieren:

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) 

Die np.concatenateMethode erzeugt einen Fehler:

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

Wenn Sie die Dokumentation zu numpy.concatenate lesen , wird ein Tupel von numpy-Array-Objekten erwartet. Das Umgeben der Variablen mit Parens hat es also behoben:

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) 

Dann druckt es:

[1 2 3 4 5 6]

Was ist hier los?

Dieser Fehler ist ein Fall von Bubble-Up-Implementierung - er wird durch die Ententypisierungsphilosophie von Python verursacht. Dies ist ein kryptischer Low-Level-Fehler, den Python-Eingeweide kotzen, wenn er einige unerwartete Variablentypen empfängt, versucht, wegzulaufen und etwas zu tun, teilweise durchkommt, die Kotzen, Abhilfemaßnahmen versucht, fehlschlägt und Ihnen dann sagt, dass "Sie können". t die Subraum-Responder neu formulieren, wenn der Wind am Dienstag aus dem Osten weht ".

In vernünftigeren Sprachen wie C ++ oder Java hätte es Ihnen gesagt: "Sie können keinen TypeA verwenden, bei dem TypeB erwartet wurde". Aber Python tut es am besten, wenn man Soldat ist, etwas Undefiniertes tut, fehlschlägt und Ihnen dann einen nicht hilfreichen Fehler zurückgibt. Die Tatsache, dass wir darüber diskutieren müssen, ist einer der Gründe, warum ich Python oder seine Ententypisierungsphilosophie nicht mag.

Eric Leschinski
quelle
5
kommt immer noch in Python 3 vor und hat mich auf mysteriöse Weise getötet.
Christophe
Versuchen Sie, den PDF-Debugger zu verwenden, um weitere Informationen über den Fehler zu erhalten: docs.python.org/3/library/pdb.html
Eric Leschinski
1
Oh, tut mir leid, mein Beitrag war unklar. Ich meinte, dass ich das gleiche Problem mit der Verkettung hatte und Ihre Antwort es für mich löste. Sie haben erwähnt, dass es ein Fehler (Feature?) Mit Python2.7 und numpy war, es existiert immer noch mit Python3 und numpy :)
Christophe
6
"Sie können die Subraum-Responder nicht auffrischen, wenn der Wind am Dienstag aus dem Osten weht." Ich mag Sie
Rosstex
1
Schau, Bruder, ich werde dir nicht 70 Smidgens für einen kaputten Defrakulator bezahlen. youtube.com/watch?v=Xk5A4QWyl1U
Eric Leschinski