¿Matriz numpy inmutable?

81

¿Existe una forma sencilla de crear una matriz NumPy inmutable?

Si uno tiene que derivar una clase ndarraypara hacer esto, ¿cuál es el conjunto mínimo de métodos que uno tiene que anular para lograr la inmutabilidad?

NPE
fuente
¿Por qué necesitas la inmutabilidad?
kennytm
37
@KennyTM Para evitar errores de codificación causados ​​por la modificación accidental de algo que se supone invariante.
NPE

Respuestas:

122

Puede hacer que una matriz numpy no se pueda escribir:

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

También vea la discusión en este hilo:

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

y la documentación:

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

JoshAdel
fuente
20
Alternativamente, a.setflags(write=False).
lafras
1
@lafrasu ¿Cuál dirías que es la forma preferida setflags()o flags.writeable=?
NPE
4
@aix: un vistazo rápido a la documentación haría parecer que los dos enfoques son idénticos. Personalmente, prefiero usar un método para establecer atributos.
lafras
3
¿Esto también lo hace memorable?
endolito
8
¡¡IMPORTANTE!! Numpy NO tiene una matriz inmutable. Las matrices con .flags.writeable = Falsetodavía no son inmutables. Si xes una matriz, y = x[:]; x.flags.writeable = False; y[0] = 5actualiza el primer elemento de xa 5.
James Parker