Ich habe diese Lösung kürzlich angewendet , um alle N Matrixzeilen zu mitteln. Obwohl die Lösung im Allgemeinen funktioniert, hatte ich Probleme bei der Anwendung auf ein 7x1-Array. Ich habe festgestellt, dass das Problem bei der Verwendung des -=
Operators liegt. Um ein kleines Beispiel zu machen:
import numpy as np
a = np.array([1,2,3])
b = np.copy(a)
a[1:] -= a[:-1]
b[1:] = b[1:] - b[:-1]
print a
print b
welche Ausgänge:
[1 1 2]
[1 1 1]
Im Fall eines Arrays a -= b
ergibt sich also ein anderes Ergebnis als a = a - b
. Ich dachte bis jetzt, dass diese beiden Wege genau gleich sind. Was ist der Unterschied?
Wie kommt es, dass die von mir erwähnte Methode zum Summieren aller N Zeilen in einer Matrix funktioniert, z. B. für eine 7x4-Matrix, aber nicht für ein 7x1-Array?
Intern besteht der Unterschied darin, dass dies:
ist gleichbedeutend damit:
während dies:
Karten dazu:
In einigen Fällen
__sub__()
und__isub__()
arbeiten auf ähnliche Weise. Aber veränderbare Objekte sollten mutieren und sich bei der Verwendung selbst zurückgeben__isub__()
, während sie ein neues Objekt mit zurückgeben sollten__sub__()
.Durch Anwenden von Slice-Operationen auf numpy-Objekte werden Ansichten auf diese erstellt, sodass durch deren Verwendung direkt auf den Speicher des "ursprünglichen" Objekts zugegriffen wird.
quelle
Die Dokumente sagen:
Als Faustregel gilt, dass eine erweiterte Substraktion (
x-=y
)x.__isub__(y)
für die IN- Place-Operation WENN möglich ist, wenn eine normale Substraktion (x = x-y
) vorliegtx=x.__sub__(y)
. Bei nicht veränderlichen Objekten wie Ganzzahlen ist dies äquivalent. Aber für veränderbare wie Arrays oder Listen, wie in Ihrem Beispiel, können sie sehr unterschiedliche Dinge sein.quelle