For Schleife ersetzen sinvoll?

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
incoggnito
User
Beiträge: 53
Registriert: Donnerstag 27. April 2017, 09:28

Hallo Zusammen,

ich habe gelesen, dass es sinnvoll sein kann die for-Schleifen durch map zu ersetzen.
Folgende Schleife im Beispiel ersetzt die 1 an Stelle 6 des Vektors durch eine -1.

Code: Alles auswählen

import numpy as np

Index=np.array([0,6])
Vektor=np.array([-1,-1,-1,-1,-1,-1,1,-1]);
         
for k in range(0,len(Index)):
    if Index[-1] < len(Vektor)-1:
        if Vektor[Index[k]+1] == -1:       
            Vektor[Index[k]]=-1
Würdet ihr das anders machen?

Grüße Inco
Zuletzt geändert von Anonymous am Montag 8. Mai 2017, 12:35, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@incoggnito: in Python iteriert man direkt über ein Array und nicht indirekt mit einem Index

Code: Alles auswählen

import numpy as np

indices = np.array([0,6])
vektor = np.array([-1,-1,-1,-1,-1,-1,1,-1]);
         
for index in indices:
    if vektor[index+1] == -1:       
        vektor[index] = -1
Dann sollte man bei numpy-Arrays immer schauen, ob eine Vektor-Operation statt einer Schleife möglich ist:

Code: Alles auswählen

import numpy as np

indices = np.array([0,6])
vektor = np.array([-1,-1,-1,-1,-1,-1,1,-1]);

mask = vektor[indices+1] == -1
vektor[indices[mask]] = -1
incoggnito
User
Beiträge: 53
Registriert: Donnerstag 27. April 2017, 09:28

Hallo Sirius,

danke für deine Hilfe.
Mir ist nur nicht klar wie ich in der Vektorform die Abfrage des Grenzwertes hinbekomme:

Beispiel steht die 1 an letzter Stelle:

Code: Alles auswählen

indices=np.array([1,3,7])
vector=np.array(-1,1,-1,1,-1,-1,-1,1)
Es soll dann nur der letzte 1er ignoritert werden,... alle anderen sollen ersetzt werden. Wird der letzte 1er nicht ignoriert bekomme ich eine Fehlermeldung out of bounds...

In der for-Schleife über k , konnte ich das so abfangen:

Code: Alles auswählen

    if Index[k] < len(Vektor)-1:
grüße
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@incoggnito: dann mußt Du halt erst die zu großen Indizes herausnehmen:

Code: Alles auswählen

indices = np.array([1,3,7])
indices = indices[indices + 1 < len(vector)]
incoggnito
User
Beiträge: 53
Registriert: Donnerstag 27. April 2017, 09:28

Danke, das hat sich gelohnt ... 0,3s Laufzeit verkürzt.
Antworten