Für diejenigen, die mit großen Matrizen umgehen, ist das Malloc / Realloc von Matrizen ein wichtiges Thema. Böse Menschen, die Speicher recyceln möchten, sollten sich diesen kurzen Spickzettel ansehen.
Es kann vorkommen, dass Sie das Array mit 0 füllen möchten, z. B. am Anfang einer Schleife. Verwenden Sie "numpy.ndarray.fill", um ein bereits zugewiesenes Array mit einem bestimmten Wert zu füllen.
import numpy as np
a = np.ones(5)
for i in range(5):
a.fill(0)
a[i] = 1
print(a)
Verwenden Sie "numpy.copyto", wenn Sie den Inhalt eines Arrays in ein anderes Array kopieren möchten. Beachten Sie, dass numpy.copy
ein neues Array generiert.
import numpy as np
m, n = 2000, 1000
A = np.ones((m, n))
B = np.zeros(A.shape)
#Eine Kopie, die kein neues Array generiert
np.copyto(B, A)
Wenn Sie ein großes Array sichern und von Anfang an mit einem kleinen Array füllen möchten, können Sie Slices verwenden. Wenn Sie den verbleibenden Teil mit 0 füllen möchten, verwenden Sie die obige "Füllung", um ihn zu verarbeiten.
import numpy as np
a = np.array([0, 1, 2, 3, 4])
b = np.array([5, 5, 5])
np.copyto(a[0:3], b) #Füllen Sie von Anfang an mit kleinen Array-Werten
a[3:5].fill(0) #Füllen Sie den restlichen Teil mit 0
Für mathematische Operationen können diejenigen, die "out" als Argument verwenden können, das Speicherziel angeben. Selbst wenn Sie es nicht bekommen können, gibt es Zeiten, in denen Sie nicht mit der Sequenz selbst herumspielen.
Operationen, die den Parameter "out" in [Mathematische Funktionen] angeben können (https://numpy.org/doc/stable/reference/routines.math.html), verwenden Speicher. Die "Form" des Arrays kann unterschiedlich sein, solange sie innerhalb des Bereichs liegt, den der Rundfunk verarbeiten kann. Wenn das Zuweisungsziel mit der ursprünglichen Matrix übereinstimmt, können Sie einen Zuweisungsoperator wie "+ =" verwenden.
import numpy as np
A = np.array([[1, 2, 3],
[4, 5, 6]])
B = np.array([[7, 8, 9],
[8, 7, 6]])
C = np.zeros(A.shape)
#Vier Regeloperationen, die kein neues Array generieren
np.add(A, B, out=C)
np.multiply(A, B, out=C)
np.subtract(A, B, out=C)
np.divide(A, B, out=C)
#Muster, die Zuweisungsoperatoren verwenden
A += B
A -= B
A *= B
A /= B
Beachten Sie, dass "A = A + B" eine neue Matrix erzeugt und diese "A" zuweist.
Die Übertragung spielt nur mit dem Parameter namens strides Es ist schnell, weil die Sequenz selbst nicht manipuliert wird.
import numpy as np
A = np.array([[1, 2, 3],
[4, 5, 6]])
#Die Translokation generiert keine neue Sequenz
B = A.T
B[0,1] = 9
print(A)
output
array([[1, 2, 3],
[9, 5, 6]])
Obwohl in diesem Artikel nicht vorgestellt, ist "Umformen" auch schnell, da sich die Reihenfolge der Anordnung selbst nicht geändert hat.
Sie können den Operator * =
verwenden.
import numpy as np
A = np.array([[1, 2, 3],
[4, 5, 6]])
A *= 5
out
kann auch für numpy.dot
angegeben werden.
import numpy as np
A = np.array([[1, 2, 3],
[4, 5, 6]])
B = np.array([[7, 8, 9],
[8, 7, 6]])
C = np.zeros((2, 2))
#Matrixprodukt, das kein neues Array generiert
np.dot(A, B.T, out=C)
Verwenden Sie außerdem beim Multiplizieren mehrerer Matrizen numpy.linalg.multi_dot
, um das Matrixprodukt in der effizientesten Reihenfolge zu erhalten. Hier kann jedoch nicht "out" angegeben werden.
Recommended Posts