Python Liste der Listen vs numpy

Also, ich habe ein Snippet von einem Skript:

lol = [] latv1 = 0 latv2 = 0 latv3 = 0 #Loop a for a in range(100): #Refresh latv2 after each iteration of loop a latv2 = 0 #Loop b for b in range(100): #Refresh latv3 after each iteration of loop b latv3 = 0 #Loop c for c in range(100): #Make 4 value list according to iteration and append to lol midl2 = [latv1,latv2,latv3,0] lol.append(midl2) #Iterate after loop latv3 = latv3 + 1 latv2 = latv2 + 1 latv1 = latv1 + 1 

Was wird tun was ich will … aber sehr langsam. Es gibt:

  • Wie man ein numpy Array auf polyphone Musik übersetzt
  • Numpy: Wie kann man einen Dataset (Array) in Trainings- und Test-Datasets aufteilen, z. B. Cross-Validierung?
  • Wie kann ich eine mehrdimensionale Liste in Python mischen?
  • Wie konvertiert man eine 1D-Python-Liste mit Bilddaten in ein numpy Array und zeigt es
  • Numpy: äußeres Produkt von n Vektoren
  • Maskieren Sie bestimmte Werte aus einem Array aus
  •  [[0,0,0,0] [0,0,1,0] ... [0,1,0,0] [0,1,1,0] ... [9,9,8,0] [9,9,9,0]] 

    Ich habe über numpy und seine Geschwindigkeit und Optimierung gelesen. Ich kann nicht herausfinden, wie man mit numpy umsetzt, was ich oben habe. Ich habe gelernt, wie man eine Reihe von Nullen mit numpy über die Handbücher zu machen:

     numpy_array = np.zeroes((100,4)) 

    Geben:

     [[ 0. 0. 0. 0.] [ 0. 0. 0. 0.] [ 0. 0. 0. 0.] ..., [ 0. 0. 0. 0.] [ 0. 0. 0. 0.] [ 0. 0. 0. 0.]] 

    Und kann die Werte jeder Spalte ändern mit:

     numpA = np.arange(0,100,1) numpB = np.arange(0,100,1 numpC = np.arange(0,100,1) numArr[:,0] = numpA numArr[:,1] = numpB numArr[:,2] = numpC 

    Geben:

     [[ 0. 0. 0. 0.] [ 1. 1. 1. 0.] [ 2. 2. 2. 0.] ..., [ 997. 997. 997. 0.] [ 998. 998. 998. 0.] [ 999. 999. 999. 0.]] 

    Aber ich kann nicht ein numpy Array 1000000 Zeilen lang und haben die Spalten inkrementieren wie das ursprüngliche Beispiel hat. Wenn ich die Null-Array-Erstellung mit 1000000 anstelle von 100 anrufe, funktioniert die Spalten-Substitution nicht, was sinnvoll ist, da die Länge des Arrays und die Substitution ungleich sind – aber ich bin mir nicht sicher, wie man die Substitutions-Arrays korrekt iterieren muss.

    Wie kann ich die ursprünglichen Skripte über numpy Arrays replizieren?

    Hinweis: Dies ist eine Python 2.7 Maschine, aber es ist mindestens 64 Bit. Ich weiß, RAM-Nutzung ist ein Problem, aber ich sollte in der Lage sein, den dtype des Arrays zu ändern, um meine Bedürfnisse anzupassen.

    One Solution collect form web for “Python Liste der Listen vs numpy”

    Ansatz Nr. 1

    Um das NumPy-Äquivalent des gebuchten Codes zu erstellen und NumPy-Array als Ausgabe zu haben, könntest du zusätzlich die itertools ,

     from itertools import product out = np.zeros((N**3,4),dtype=int) out[:,:3] = list(product(np.arange(N), repeat=3)) 

    Bitte beachten Sie, dass es N = 100 , um es dem gebuchten Code zu entsprechen.

    Ansatz Nr. 2

    Ein weiterer potenziell schnellerer Ansatz, der auf rein NumPy basiert und seine vektorisierten Sendefähigkeiten einsetzt, könnte so vorgeschlagen werden,

     out = np.zeros((N**3,4),dtype=int) out[:,:3] = (np.arange(N**3)[:,None]/[N**2,N,1])%N 

    Ich würde denken, dass dies schneller als die vorherigen itertools basiert ist, weil das eine Liste von Tupeln erstellt hat, die in ein NumPy-Array gesetzt werden sollen. Wir werden diese Theorie im nächsten Abschnitt testen.


    Runtime-Test

     In [111]: def itertools_based(N): ...: out = np.zeros((N**3,4),dtype=int) ...: out[:,:3] = list(product(np.arange(N), repeat=3)) ...: return out ...: ...: def broadcasting_based(N): ...: out = np.zeros((N**3,4),dtype=int) ...: out[:,:3] = (np.arange(N**3)[:,None]/[N**2,N,1])%N ...: return out In [112]: N = 20 In [113]: np.allclose(itertools_based(N),broadcasting_based(N)) # Verify results Out[113]: True In [114]: %timeit itertools_based(N) 100 loops, best of 3: 7.42 ms per loop In [115]: %timeit broadcasting_based(N) 1000 loops, best of 3: 1.23 ms per loop 

    Nun, lasst uns mal nur die Schöpfung der Tupel von diesen iterierten Elementen und legte es gegen die NumPy-basierte –

     In [116]: %timeit list(product(np.arange(N), repeat=3)) 1000 loops, best of 3: 746 µs per loop In [117]: %timeit (np.arange(N**3)[:,None]/[N**2,N,1])%N 1000 loops, best of 3: 1.09 ms per loop 

    Nun, so ist die Schöpfung Teil für die itertools-based ist jetzt schneller, wie vorhergesagt / dachte früher! Also, wenn Sie mit den ersten drei Spalten als Ausgabe zufrieden sind und sie Liste der Tupel sind, dann gehen Sie mit itertools .

    Python ist die beste Programmiersprache der Welt.