Is there a simple way to create an immutable NumPy array?
If one has to derive a class from ndarray
to do this, what's the minimum set of methods that one has to override to achieve immutability?
Is there a simple way to create an immutable NumPy array?
If one has to derive a class from ndarray
to do this, what's the minimum set of methods that one has to override to achieve immutability?
You can make a numpy array unwriteable:
a = np.arange(10)
a.flags.writeable = False
a[0] = 1
# Gives: ValueError: assignment destination is read-only
Also see the discussion in this thread:
http://mail.scipy.org/pipermail/numpy-discussion/2008-December/039274.html
and the documentation:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.flags.html
a.setflags(write=False)
. –
Handbag setflags()
or flags.writeable=
? –
Adjective .flags.writeable = False
are still not immutable. If x
is an array, y = x[:]; x.flags.writeable = False; y[0] = 5
updates the first element of x
to 5
. –
Homocercal y
. –
Ruthannruthanne writable
flag is set to False
before you slice then then y
above would fail on update. –
Alberich y.flags.writeable = True
when that value for x
is true. It's just changing writeable
for x
does not update that of y
directly. –
Homocercal writable
tag numpy.org/doc/stable/reference/generated/… –
Syringe arr.flags.writeable = False
, but then I called for i in range(5): np.random.shuffle(arr[:,i])
, which shuffled the array in place - no errors or warnings. –
Ladin arr = np.arange(30).reshape(6,5)
. If you tried for i in range(5): np.random.shuffle(arr[:,i])
on arr = np.arange(10)
you would definitely get an IndexError
. –
Ladin Setting the flag directly didn't work for me, but using ndarray.setflags
did work:
a = np.arange(10)
a.setflags(write=False)
a[0] = 1 # ValueError
I have a subclass of Array at this gist: https://gist.github.com/sfaleron/9791418d7023a9985bb803170c5d93d8
It makes a copy of its argument and marks that as read-only, so you should only be able to shoot yourself in the foot if you are very deliberate about it. My immediate need was for it to be hashable, so I could use them in sets, so that works too. It isn't a lot of code, but about 70% of the lines are for testing, so I won't post it directly.
Note that it's not a drop-in replacement; it won't accept any keyword args like a normal Array constructor. Instances will behave like Arrays, though.
© 2022 - 2024 — McMap. All rights reserved.