Schleifenproblem

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
danieldüse
User
Beiträge: 3
Registriert: Donnerstag 7. Juli 2022, 12:49

Hallo, ich bin es erneut. Euer Daniel mit einem neuem Problem, das mir gelinde gesagt schon etwas peinlich ist aber wer nicht fragt bleibt dumm.
Ich habe eine Liste die insgesamt 20 Array enthält. Jeder Array beinhalten 2 Spalten und unmengen an Zeilen. Was ich möchte ist diese Array zu Filtern und zwar nach der ersten Spalte. Da in der ersten Spalte immer wieder Maximalwerte vorkommen die ich bereits ermittelt habe. ich habe Folgendes versucht:

A = Liste mit Arrays der Anzahl j
P = Array mit den Maximalwerten

Code:

B = [ ]

for j in range( 0, len( A ) - 1):
C = [ ]
for i in range(0, len( A [ j ] )):
if A[ j ][ i, 0 ] <= P[ j ]:
C.append(A[ j ][i , 0:2 ])

B.append(C[ j ])

Was ich bekomme ist ein B mit j Array, die jeweils nur ein Wertepaar enthalten und ein C mit Array der Anzahl i des letzten j die aber auch nur je ein Wertepaar enthalten. Was ich möchte ist eigentlich wieder eine Liste mit j Arrays, die dann die Werte nach dem Maximalwert nicht mehr enthalten. Wo ist der Fehler?
Vielen Dank
daniel düse
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@danieldüse: Wenn man mit Numpy-Arrays arbeitet und da Python-Schleifen schreibt die über einen Laufindex auf die Elemente zugreifen, dann macht man in aller Regel etwas falsch.

Selbst wenn man die Python-Schleifen schreibt, wird man beide Indexvariablen (fast) los. `j` wird ja noch mal als Index in `C` verwendet, was ich nicht so ganz verstehe, darum erzeuge ich das hier noch per `enumerate()`:

Code: Alles auswählen

B = []

for j, (a, p) in enumerate(zip(A[:-1], P)):
    C = [a_row[0:2] for a_row in a if a_row[0] <= p]
    B.append(C[j])
Das mit dem ``C[j]`` sieht auch irgendwie nicht robust aus, denn die Länge von `C` ist ja potentiell kürzer als `A`, das heisst `j` kann grösser als die Länge von `C` werden und damit einen `IndexError` riskieren.

Das liesse sich auch komplett mit „list comprehensions“ ausdrücken:

Code: Alles auswählen

B = [
    [a_row[0:2] for a_row in a if a_row[0] <= p][j]
    for j, (a, p) in enumerate(zip(A[:-1], P))
]
Was hier auch blöd ist, sind die supergenerischen Namen. Es trägt halt nicht zum Verständnis bei was da eigentlich passiert oder passieren sollte. Wenn man weiss was Werte in dem Programm für eine Bedeutung haben, ist es leichter zu verstehen und auch zu sehen ob die Operationen Sinn machen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@danieldüse: der Code sieht sehr komisch aus. Warum wird er letzte Eintrag in der Liste `A` nicht benutzt? Warum wird aus der gefilterten Liste der j-te Eintrag verwendet?
Ohne Beispieldaten, die zeigen, wie die Arrays aufgebaut sind und dem daraus folgenden gewünschten Ergebnis läßt sich die Frage nicht beantworten.
Antworten