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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
zange121308
User
Beiträge: 6
Registriert: Dienstag 24. August 2021, 15:57

Hallo,

ich habe folgendes Problem. Bei meinem Code wird in der letzten Zeile folgender Fehler angezeigt:

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

kann mir da vielleicht jemand weiterhelfen?

Viele Grüße


import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
from scipy.optimize import curve_fit

############Datei-Import##################

data = np.loadtxt("./TEST1.txt",skiprows = 4)

###########Schreibe Daten in Listen###########

t = data[:,0]-0
signal_t = data[:,1]-0

t = t[0:6000]
signal_t = signal_t[0:6000]

dt = t[1]-t[0] #Zeitschritt
fa=1/dt #Abtastfrequenz
print('dt=%.5fs (Zeitschritte)' % dt)
print('fa=%.2fHz (Abtastfrequenz)' % fa)

#######Detrending des Signals######

s=signal.detrend(signal_t)
#s=signal_t

sos = signal.butter(1,1, 'hp', fs=fa, output='sos')
signal_t = signal.sosfilt(sos, signal_t)
sos = signal.butter(4, 21, 'lp', fs=fa, output='sos')
signal_t = signal.sosfilt(sos, signal_t)
s = signal_t
################Fensterfunktion##############

hann=np.hanning(len(s))
f_t=list(hann*s)

##############ZeroPadding####################

Zeropadding=2**2*len(t)
print(Zeropadding)

zpy=np.zeros(shape=(1,Zeropadding+1),dtype=float)
zpx=np.arange(t[-1],t[-1]+Zeropadding*dt,dt,float)

t_1 = np.append(t, zpx) #gepaddete Zeitachse
f_t_1 = np.append(f_t, zpy) #gepaddete Funktion

##########Fourier-Transformation##############

Y =np.fft.fft(f_t_1)

N_0 =len(f_t)
N_1 =len(f_t_1)

print('NO= ', N_0)
print('N1= ', N_1)

X = np.linspace(0,fa/2,int(N_1/2+1),endpoint=True)

##########PLOTS##############

fig, axes = plt.subplots(2, 1, figsize=(8, 8))

#Diagramm Zeit-Verschiebung
axes[0].plot(t,signal_t,lw=1,color='b', label='Verschiebung im Schw.bauch')
axes[0].grid(color='k', alpha=0.5, linestyle='dashed', linewidth=0.5)
axes[0].autoscale(enable=True, axis='y')
axes[0].autoscale(enable=True, axis='x')
#axes[0].set_xlim([0, 1])
axes[0].set_title("a(t)")
axes[0].axvline(0.646,lw=0.7, linestyle='dashed')

#Diagramm Amplitudenspektrum
axes[1].plot(X,2*np.abs(Y[:int(N_1/2+1)])/int(N_1/2+1),lw=1,color='r')
axes[1].grid(color='k', alpha=1, linestyle='dashed', linewidth=0.5)
#axes[1].axis('tight')
axes[1].set_title("Amplitudenspektrum")
axes[1].set_ylim([0, 0.2*10**-8])
axes[1].autoscale(enable=True, axis='y')
axes[1].set_xlim([0, 20])
axes[1].set_ylabel('Amplitude')
axes[1].set_xlabel('Frequenz')


###############Auswertung des Amplitudenspektrums################


d=10/(X[1]-X[0]) #Distance(Abstand zwischen Peaks)
bound=(None) #Grenzen(obere und untere Grenzen für Peaks =NONE wenn keine Grenzen benötigt)

psignal=2*np.abs(Y[:int(N_1/2+1)])/int(N_1/2+1)
peaks, _= signal.find_peaks(psignal,distance=d,height=bound,prominence=2*10**-4)
print('Peakhöhe=' , X[peaks])
print('Frequenz bei Peak= ', psignal[peaks])
print('Versuch= ',X[1]-X[0])


axes[1].scatter(X[peaks],psignal[peaks],marker='o',color='green', label='f=%5.2f Hz' % X[peaks])
Benutzeravatar
Dennis89
User
Beiträge: 1556
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

sorry ich weis nicht was dein Code da im Detail so macht, aber vielleicht hilft dir das weiter:
https://www.pythonpool.com/only-size-1- ... or-solved/

Also du musst mal überprüfen, was deine 'numpy'-Funktionen für Argumenttypen erwarten.


Grüße
Dennis

P.S.: Es ist hilfreich den Code in Code-Tags (der </> - Knopf) zu posten ink. der vollständigen Fehlermeldung
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

@zange121308: es wäre noch hilfreich, die komplette Fehlermeldung zu sehen, damit man weiß, in welcher Zeile der Fehler auftritt.
So muß man raten, dass das wohl in der letzten Zeile auftaucht, wo Du versuchst viele X-Werte über einen Formatierungsstring auszugeben. Was möchtest Du denn in dem einen Label stehen haben?
zange121308
User
Beiträge: 6
Registriert: Dienstag 24. August 2021, 15:57

Schon mal vielen Dank für die Rückmeldung und danke für die Hilfsbereitschaft😊 ich werde heute abend das nochmal reinstellen, so dass man es besser lesen kann.

Liebe Grüße
Benutzeravatar
noisefloor
User
Beiträge: 4195
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

also die Fehlermeldung besagt, dass du irgendwo (wo sollte in der vollen Fehlermeldung stehen) versuchst, einen mehrelementigen oder mehrdimensionalen Array in ein Skalar zu wandeln - was natürlich nicht geht.

Die Fehlermeldung kann man auch nachstellen:

Code: Alles auswählen

>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> b = np.array([4])
>>> c = np.array([[1, 2], [3, 4]])
>>> a.item()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: can only convert an array of size 1 to a Python scalar
>>> b.item()
4
>>> c.item()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: can only convert an array of size 1 to a Python scalar
Gruß, noisefloor
zange121308
User
Beiträge: 6
Registriert: Dienstag 24. August 2021, 15:57

So hier nochmal der Code etwas übersichtlicher:

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
from scipy.optimize import curve_fit

 ############Datei-Import##################

data = np.loadtxt("./TEST1.txt",skiprows = 4)

 ###########Schreibe Daten in Listen###########

t        = data[:,0]-0
signal_t = data[:,1]-0

t        = t[0:6000]
signal_t = signal_t[0:6000]

dt = t[1]-t[0]     #Zeitschritt
fa=1/dt            #Abtastfrequenz
print('dt=%.5fs (Zeitschritte)' % dt)
print('fa=%.2fHz (Abtastfrequenz)' % fa)

 #######Detrending des Signals######

s=signal.detrend(signal_t)
 #s=signal_t

sos = signal.butter(1,1, 'hp', fs=fa, output='sos')
signal_t = signal.sosfilt(sos, signal_t)
sos = signal.butter(4, 21, 'lp', fs=fa, output='sos')
signal_t = signal.sosfilt(sos, signal_t)
s = signal_t
 ################Fensterfunktion##############

hann=np.hanning(len(s)) 
f_t=list(hann*s)

 ##############ZeroPadding####################

Zeropadding=2**2*len(t)
print(Zeropadding)

zpy=np.zeros(shape=(1,Zeropadding+1),dtype=float)
zpx=np.arange(t[-1],t[-1]+Zeropadding*dt,dt,float)

t_1 = np.append(t, zpx) #gepaddete Zeitachse
f_t_1 = np.append(f_t, zpy) #gepaddete Funktion

 ##########Fourier-Transformation##############

Y =np.fft.fft(f_t_1)

N_0 =len(f_t)
N_1 =len(f_t_1)

print('NO= ', N_0)
print('N1= ', N_1)

X  = np.linspace(0,fa/2,int(N_1/2+1),endpoint=True)

 ##########PLOTS##############

fig, axes  = plt.subplots(2, 1, figsize=(8, 8))

 #Diagramm Zeit-Verschiebung
axes[0].plot(t,signal_t,lw=1,color='b', label='Verschiebung im Schw.bauch')
axes[0].grid(color='k', alpha=0.5, linestyle='dashed', linewidth=0.5)
axes[0].autoscale(enable=True, axis='y')
axes[0].autoscale(enable=True, axis='x')
 #axes[0].set_xlim([0, 1])
axes[0].set_title("a(t)")
axes[0].axvline(0.646,lw=0.7, linestyle='dashed')

 #Diagramm Amplitudenspektrum
axes[1].plot(X,2*np.abs(Y[:int(N_1/2+1)])/int(N_1/2+1),lw=1,color='r')
axes[1].grid(color='k', alpha=1, linestyle='dashed', linewidth=0.5)
 #axes[1].axis('tight')
axes[1].set_title("Amplitudenspektrum")
axes[1].set_ylim([0, 0.2*10**-8])
axes[1].autoscale(enable=True, axis='y')
axes[1].set_xlim([0, 20])
axes[1].set_ylabel('Amplitude')
axes[1].set_xlabel('Frequenz')


 ###############Auswertung des Amplitudenspektrums################


d=10/(X[1]-X[0])    #Distance(Abstand zwischen Peaks)
bound=(None)        #Grenzen(obere und untere Grenzen für Peaks =NONE wenn keine Grenzen benötigt)

psignal=2*np.abs(Y[:int(N_1/2+1)])/int(N_1/2+1)
peaks, _= signal.find_peaks(psignal,distance=d,height=bound,prominence=2*10**-4)
print('Peakhöhe=' , X[peaks])
print('Frequenz bei Peak= ', psignal[peaks])
print('Versuch= ',X[1]-X[0])


axes[1].scatter(X[peaks],psignal[peaks],marker='o',color='green', label='f=%5.2f Hz' % X[peaks])


 #############Curve-Fit Zeitverschiebungskurve#############

peaks_u = signal.find_peaks(signal_t,height=0.0,distance=40,)
axes[1].scatter(t[peaks_u],signal_t[peaks_u],marker='x',color='red')

def fitfunc(t,a,delta): #Definition der Fitfunktion
 return a* np.exp(-delta*t)

xdata=t[peaks_u]
ydata=signal_t[peaks_u]

popt, pcov = curve_fit(fitfunc, xdata, ydata) #Curvfitting
print('a= ',popt[0], ' delta=',popt[1])
D= popt[1:2]/(np.sqrt((2*np.pi*X[peaks[0]])**2+popt[1:2]**2))*100
 #Dämpfungsberechnung
print('Lehrsches Dämpfungsmaß= ',D)
print((X[peaks[0]]))
a_1=popt[0:1]
b_1=popt[1:2]
xi_1=b_1/2/3.14/10.3*100
print(xi_1)
print(popt[1])

axes[0].plot(t, fitfunc(t, *popt), color='green', lw=1, label='Fitkurve: D=%5.2f Prozent' % D)
 #axes[0].plot(xdata, 1.2558*10**-6*np.exp(-0.9755345*xdata))

legend= axes[0].legend(loc='lower right', shadow=True, fontsize='medium')
legend.get_frame().set_edgecolor('C5')

legend= axes[1].legend(loc='lower right', shadow=True, fontsize='medium')
und das hier ist die Fehlermeldung:

Code: Alles auswählen

runfile('F:/Python/FFT.py', wdir='F:/Python')
dt=0.00010s (Zeitschritte)
fa=10000.00Hz (Abtastfrequenz)
24000
NO=  6000
N1=  30001
Peakhöhe= []
Frequenz bei Peak=  []
Versuch=  0.3333333333333333
Traceback (most recent call last):

  File "F:\Python\FFT.py", line 99, in <module>
    axes[1].scatter(X[peaks],psignal[peaks],marker='o',color='green', label='f=%5.2f Hz' % X[peaks])

TypeError: only size-1 arrays can be converted to Python scalars
Ich kenne mich eigentlich auch gar nicht aus. Ich benötige den Code nur für meine Masterarbeit.
Es wäre echt nett, wenn mir da jemand helfen könnte.

Liebe Grüße
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@zange121308,

an der Ausgabe sieht man, dass X[peaks] ein leeres numpy array ist:

Code: Alles auswählen

Peakhöhe= []
Das entsteht ja aus dieser Codezeile:

Code: Alles auswählen

print('Peakhöhe=' , X[peaks])
Dementsprechend gibt es hier die Fehlermeldung, die du siehst, denn X[peaks] ist so etwas: np.array([])

Code: Alles auswählen

axes[1].scatter(X[peaks],psignal[peaks],marker='o',color='green', label='f=%5.2f Hz' % X[peaks])
Du must dir also Gedanken machen, warum die Peakhöhe eine leere Liste ist. Wahrscheinlich hat in der Zeile davor die Funktion "find_peaks" eben keine gefunden.

Ich kenne deine Daten nicht, daher ist es schwer zu sagen, woran das liegt.
zange121308
User
Beiträge: 6
Registriert: Dienstag 24. August 2021, 15:57

Vielen Dank. Ist schon einmal gut zu wissen, dass es an den Daten liegen könnte.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

zange121308 hat geschrieben: Mittwoch 25. August 2021, 18:14 Ist schon einmal gut zu wissen, dass es an den Daten liegen könnte.
Nicht unbedingt. Die Funktion find_peaks() hat ja eine ganze Reihe von Eingangsparametern um überhaupt zu definieren was eigentlich als Peak ausgewertet werden soll.
(z.B. wie hoch müssen lokale Maxima über dem Grundrauschen liegen um sich davon zu unterscheiden)
Es kann also sein, dass die Daten korrekt sind, aufgrund der Parameter aber keine Peaks erkannt werden.
zange121308
User
Beiträge: 6
Registriert: Dienstag 24. August 2021, 15:57

Ich habe den Fehler gefunden.

Code: Alles auswählen

peaks, _= signal.find_peaks(psignal,distance=d,height=bound,prominence=2*10**-8)
Hier musste ich die prominence meiner Daten anpassen.
Nur jetzt folgt gleich der nächste Fehler. ich denke mal, dass ich hier auch wieder die Definitionen zu meinen Daten anpassen muss.

Code: Alles auswählen

peaks_u = signal.find_peaks(signal_t,height=1.5*10**-5,distance=1,)
axes[1].scatter(t[peaks_u],signal_t[peaks_u],marker='x',color='red')
Fehlermeldung:

Code: Alles auswählen

  File "F:\Python\FFT.py", line 105, in <module>
    axes[1].scatter(t[peaks_u],signal_t[peaks_u],marker='x',color='red')

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@zange121308,

"peaks_u" ist ja ein numpy array (Rückgabewert von find_peaks()). Das kann man nicht so einfach als index für ein anderes numpy array verwenden.
Es könnte funktionieren, "peaks_u" direkt an die scatter Funktion zu übergeben.
zange121308
User
Beiträge: 6
Registriert: Dienstag 24. August 2021, 15:57

Hey Leute, ich habe es zum Laufen gebracht. Vielen Dank für eure Hilfe!!!!!!!!!!!
Antworten