Unveränderliches Numpy-Array?

79

Gibt es eine einfache Möglichkeit, ein unveränderliches NumPy-Array zu erstellen?

Wenn man eine Klasse ableiten muss, um ndarraydies zu tun, was ist die Mindestmenge an Methoden, die man überschreiben muss, um Unveränderlichkeit zu erreichen?

NPE
quelle
Warum brauchst du Unveränderlichkeit?
Kennytm
36
@KennyTM Um Codierungsfehler zu vermeiden, die durch versehentliches Ändern von etwas verursacht werden, das als unveränderlich angenommen wird.
NPE

Antworten:

119

Sie können ein numpy-Array nicht beschreibbar machen:

a = np.arange(10)
a.flags.writeable = False
a[0] = 1
# Gives: ValueError: assignment destination is read-only

Siehe auch die Diskussion in diesem Thread:

http://mail.scipy.org/pipermail/numpy-discussion/2008-December/039274.html

und die Dokumentation:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.flags.html

JoshAdel
quelle
20
Alternativ a.setflags(write=False).
Lafras
1
@lafrasu Was würdest du sagen, ist die bevorzugte Form, setflags()oder flags.writeable=?
NPE
3
@aix: Ein kurzer Blick auf die Dokumentation würde den Eindruck erwecken, dass die beiden Ansätze identisch sind. Persönlich bevorzuge ich die Verwendung einer Methode zum Festlegen von Attributen.
Lafras
3
Macht es das auch einprägsam?
Endolith
8
WICHTIG!! Numpy hat KEIN unveränderliches Array. Arrays mit .flags.writeable = Falsesind immer noch nicht unveränderlich. Wenn xes sich um ein Array handelt, wird y = x[:]; x.flags.writeable = False; y[0] = 5das erste Element von xto aktualisiert 5.
James Parker