it-swarm.com.de

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

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
69
user3291404

Non-Numpy-Funktionen wie math.abs() oder math.log10() lassen sich mit Numpy-Arrays nicht gut spielen. Ersetzen Sie einfach die Zeile, die einen Fehler auslöst, durch:

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

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

93
Tom Pohl

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) 

Das np.concatenate Methode 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 mit numpy-Array-Objekten erwartet. Das Umgeben der Variablen mit parens hat es 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 wird gedruckt:

[1 2 3 4 5 6]

Was ist hier los?

Dieser Fehler ist ein Fall von Bubble-Up-Implementierung - er wird durch die Enten-Typisierungsphilosophie von Python verursacht. Dies ist ein kryptischer Low-Level-Fehler python============================================================================= Das , sagt Ihnen dann, dass "Sie die Subraum-Responder nicht umformulieren können, wenn der Wind am Dienstag von 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, Soldat zu sein, tut etwas undefiniertes, versagt und gibt Ihnen dann einen nicht hilfreichen Fehler zurück. Die Tatsache, dass wir darüber diskutieren müssen, ist einer der Gründe, warum ich es nicht tue wie Python oder seine Enten-Typisierungsphilosophie.

61
Eric Leschinski