Implementierung eines Low pass Filters

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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Deine Variablennamen sind größtenteils schlecht, weil Abkürzungen oder einbuchstabig Namen nichts zum Verständnis beitragen. Was ist y, k oder z?
Zum Aufteilen gibt es np.split, da muss man nicht selbst eine Listcomprehension schreiben. Ist `elem + 1` wirklich das was Du möchtest?
Risingsun
User
Beiträge: 43
Registriert: Dienstag 8. November 2022, 14:56

Entschuldige den Code den ich gepostet habe kann garnicht funktionieren.
Ich hatte was ausprobiert, es aber nicht zurückgeändert.

Das ist der richtige Code.

Code: Alles auswählen

y=[y[pre: next] for pre, next in zip(peak_pos,peak_pos[1:len(peak_pos)])]

k = []
for elem in y:
    k.append(np.correlate(elem,elem+1))
    
print (k)
Also die Variable y stehen für meine gefilterten Daten, ich überschreibe die Variable mit einem Array was aus meinen gefilterten Daten besteht, jedoch auch warum ich kein np.split genommen habe, war das mein array nach bestimmten Positionen geteilt werden musste, nach lokale Peak Positionen um genau zu sein. Somit habe ich ein Array in Subarrays die nach Peak Positionen geteilt sind.

Die Variable k ist einfach das Array was am Ende meine Ergebnisse für jedes berechnete Subarray beinhalten soll. Ich habe 13 Subarrays (sind nicht alle gleich lang), ich möchte das in dem Array k für jedes Subarray einen Wert für die berechnete Cross-Correlation steht.

Da jedes Subarray mit allen anderen Arrays verglichen werden soll bin ich mir nicht sicher, ob mit elem+1 das bewirkt wird.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Risingsun: Das `y` hier an eine Liste gebunden wird, die slices aus `y` enthält ist verwirrend, denn damit wird `y` an Listen mit zwei verschiedenen Typen gebunden.

`next()` ist der Name einer eingebauten Funktion, den sollte man nicht für etwas anderes verwenden.

Das ``len(peak_pos)`` beim slicing kann man einfach ersatzlos weg fallen lassen — das ist der Defaultwert.

Ich würde da `more_itertools.pairwise()` verwenden, oder das Rezept aus der `itertools`-Dokumentation selbst implementieren.

`k` (schlechter Name) ist sehr offensichtlich ein Kandidat für eine „list comprehension“.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

numpy.split macht die Aufteilung wie du sie brauchst: https://numpy.org/doc/stable/reference/ ... split.html - es bekommt als Argument die Indizes. Wirklich viel bringen wird's nicht, aber es ist schon das gleiche.

Was dein Problem angeht: wenn du n Segmente hast, und die paarweise vergleichen sollst, wieviele hast du dann? Und hast du so viele? Und was ist ein elem? Und wenn man elem + 1 macht, was kommt dabei rum?
Risingsun
User
Beiträge: 43
Registriert: Dienstag 8. November 2022, 14:56

Das mit dem numpy split, werde ich mir später im nachhinein anschauen, danke für den Hinweis.

@deets:

Wenn ich paarweise jedes Subarray mit allen anderen Subarrays vergleiche habe ich dann 13x13 vergleiche, aber immer noch insgesamt 13 Segmente oder was meinst du?
Ich möchte das jedes Subarray mit allen anderen Subarrays die Cross Correlation berechnet wird, das ist ja was das Feature machen sollte, denke ich.
elem ist nur eine zwischenvariable der forschleife, ich denke es enthält immer den aktuellsten Wert, in meinem Fall enthält es den aktuellsten Subarray des gesamten Arrays.
Bei elem+1 kommt das als Ergebnis raus.
https://ibb.co/cksVbFS

Elem+1 nimmt denke ich, nimmt dann immer den nächsten Subarray.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du 13 * 13 Werte erwartest (was falsch ist, es sind 78, ((n - 1) * n) / 2, wenn man nicht mit sich selbst vergleicht, sonst 91) , und damit deutlich mehr als deine 13, die du hast - dann muss also dein Vorgehen quatsch sein, oder?

Und wieso erwartest du, dass man beim addieren von 1 auf ein Array irgendein anderes array dabei rumkommt? Und wieso geht dann das hier:

Code: Alles auswählen

>>> import numpy as np
>>> a = np.array(range(10))
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a + 1
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
Warum geht das, obwohl ich nur ein array habe? Was macht das also mit deiner Hypothese, auf ein Array einen Skalar zu addieren wuerde irgendwie ein anderes deiner Sub-Arrays auswaehlen?
Risingsun
User
Beiträge: 43
Registriert: Dienstag 8. November 2022, 14:56

Stimmt du hast recht, man vergleicht sich nicht mit sich selbst.

Ich habe gedacht, das jedes Subarray einen Index hat im Array und das wenn ich um 1 addiere das es um ein Index springt.
In deinem Beispiel inkrementiert es die range um 1.

Heißt in meiner Hypothese: Das es nicht stimmt was ich sage denke ich mal. Also Elem ist der aktuelle variable, addiert es dann einfach den Wert von elem um 1?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Man vergleicht nicht nur nicht mit sich selbst, man vergleicht auch nicht mit dem Element, mit dem man schon vorher verglichen wurde. Darum sind das in der Matrix aller Elemente x Elemente nur die obere Dreiecksmatrix ohne Diagonale.

Da elem ja nun das subarray ist, und nicht der Index (den hast du gar nicht wenn du mit "for ding in dinge" arbeitest), dann springt da auch kein Index. Und selbst wenn es der Index waere: n-mal ein Array mit dem naechsten Array zu correlaten ist ja nun immer noch nicht mehr als 13 Arrays, oder?

Fuer deinen Vergleich musst du also was anderes machen. pairwise wurde ja schon genannt. Schau dir das an, was das macht.

Zu guter letzt: ja. Ein numpy-Array, auf dem man +1 ausfuehrt, liefert ein neues array, mit allen Elementen um 1 groesser. Das ist wirklich absolute Grundlage.
Antworten