[Numpy-discussion] Non-writeable default for numpy.ndarray

Tim Hochberg tim.hochberg at ieee.org
Fri Sep 29 11:12:09 CDT 2006


Francesc Altet wrote:
> Hello,
>
> Is the next a bug a feature?
>
> In [102]: f4=numpy.ndarray(buffer="a\x00b"*4, dtype="f4", shape=3)
>
> In [103]: f4
> Out[103]: array([  2.60561966e+20,   8.94319890e-39,   5.92050103e+20], 
> dtype=float32)
>
> In [104]: f4[2] = 2
> ---------------------------------------------------------------------------
> <type 'exceptions.RuntimeError'>          Traceback (most recent call last)
>
> /home/faltet/python.nobackup/numpy/<ipython console> in <module>()
>
> <type 'exceptions.RuntimeError'>: array is not writeable
>
> In [105]: f4.flags.writeable = True
>
> In [106]: f4[2] = 2
>
> In [107]: f4
> Out[107]: array([  2.60561966e+20,   8.94319890e-39,   2.00000000e+00], 
> dtype=float32)
>
>
> i.e. in an array built from ndarray, the default is that it has to be 
> read-only?
>   
It's not that the it's being built from ndarray, it's that the buffer 
that you are passing it is read only. In fact, I'd argue that allowing 
the writeable flag to be set to True in this case is actually a bug. 
Consider this slightly modified example:

     >>> a = "12345"*4
     >>> f4=numpy.ndarray(buffer=a, dtype="f4", shape=3)
     >>> f4[2] = 99
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    RuntimeError: array is not writeable
     >>> f4.flags.writeable = True
     >>> a
    '12345123451234512345'
     >>> f4.flags.writeable = True
     >>> f4[2] = 99
     >>> a
    '12345123\x00\x00\xc6B34512345'

The original, *immutable* string has been mutated. This could get you 
into real trouble in certain situations.

-tim








More information about the Numpy-discussion mailing list