[Numpy-discussion] immutable numpy arrays

Robert Kern robert.kern at gmail.com
Wed Dec 17 19:28:08 EST 2008


On Wed, Dec 17, 2008 at 17:45, Geoffrey Irving <irving at naml.us> wrote:
> On Wed, Dec 17, 2008 at 3:34 PM, Robert Kern <robert.kern at gmail.com> wrote:
>> On Wed, Dec 17, 2008 at 16:51, Geoffrey Irving <irving at naml.us> wrote:
>>> On Wed, Dec 17, 2008 at 2:24 PM, Robert Kern <robert.kern at gmail.com> wrote:
>>>> On Wed, Dec 17, 2008 at 15:52, Geoffrey Irving <irving at naml.us> wrote:
>>>>> Currently numpy arrays are either writable or unwritable, but
>>>>> unwritable arrays can still be changed through other copies.  This
>>>>> means that when a numpy array is passed into an interface that
>>>>> requires immutability for safety reasons, a copy always has to be
>>>>> made.
>>>>>
>>>>> One way around this would be to add a NPY_IMMUTABLE flag signifying
>>>>> that the contents of the array will never change through other copies.
>>>>
>>>> This is not possible to guarantee. With the __array_interface__, I can
>>>> make a numpy array point at any addressable memory without its
>>>> knowledge. We can even mutate "immutable" str objects, too.
>>>
>>> In python __array_interface__ just returns a big integer representing
>>> a pointer which can't be used for anything.
>>
>> I can (and do) *make* an array from Python given an
>> __array_interface__ with that pointer. See numpy/lib/stride_trick.py
>> in numpy 1.2 for an example.
>
> Ah.  Yes, that certainly precludes complete safety.
>
> I don't think it precludes the usefulness of an immutable flag though,
> just like it doesn't preclude the usefulness of the writeable flag.
> The stride_tricks.py code is already well-behaved: it doesn't turn
> unwriteable arrays into writeable arrays.  It certainly could, but
> this is analogous to ctypes or untrusted C code.

It just seems to me to be another complication that does not provide
any guarantees. You say "Currently numpy arrays are either writable or
unwritable, but unwritable arrays can still be changed through other
copies." Adding an immutable flag would just change that to "Currently
numpy arrays are either mutable or immutable, but immutable arrays can
still be changed through other copies." Basically, the writable flag
is intended to indicate your use case. It can be circumvented, but the
same methods of circumvention can be applied to any set of flags.

-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless
enigma that is made terrible by our own mad attempt to interpret it as
though it had an underlying truth."
  -- Umberto Eco



More information about the NumPy-Discussion mailing list