[Numpy-discussion] Attempting to sub-class NumArray

Todd Miller jmiller at stsci.edu
Fri Sep 5 15:04:06 EDT 2003


Hi Colin,

I haven't looked at this in detail,  but special.__init__() is making me
queasy.  Why doesn't it call NumArray.__init__()?

Todd

On Fri, 2003-09-05 at 15:03, Colin J. Williams wrote:
> When ravel() is used on an instance of NumArray, the _strides attribute 
> is recalculated correctly.
> When ravel() is used on an instance of special, a sub-class of NumArray, 
> the _strides attribute keeps its old value.  This appears to cause the 
> display problem which is reported.
> 
> The essentials of the code used are below.
> 
> To investigate this problem, two print statements were added to the 
> method setshape in generic.py:
> 
>             if newnelements == nelements:
>                 self._shape = tuple(shape)
>                 print 'In setShape self._shape:', self._shape
>                 self._strides = self._stridesFromShape()
>                 print 'In setShape self._strides:', self._strides
>             else:
>                 raise ValueError("New shape is not consistent with the
>     old shape")
> 
> It seems that only the first of these print statements is executed with 
> special, but both are executed with NumArray.  In the second case, the 
> output is not in the expected sequence.
> 
> I would appreciate any suggestion as to a workaround.
> 
> Colin W,
> 
> Grief when attempting to sub-class NumArray
> 
> Code used:
> 
> # Try to sub-class
> class special(N.NumArray):
>   def __init__(self, data= None, shape= None, eType= None):
> ##                         eType= _nt.Any or AnyType not acceptable %%
>     arr= N.array(sequence= data, shape= shape, type= eType)
>     for attr in dir(arr):
> ##      This is a longwinded way of setting up special
> ##      There must be a better way                     %%
> ##      Perhaps we should use generic._view
> ##      It's not documented                 TRY IT LATER
> ##      There is no need to transfer methods!
>       if attr[0] == '_' and attr[1] != '_':
>         print attr
>         exec 'self.' + attr + '= ' 'arr.' + attr
>         exec 'print self.' + attr
>     pass
> 
> a= special(data= [1, 2, 3, 4], shape= (2, 2))
> a= N.array([1, 2, 3, 4], shape= (2, 2))
> print 'In ts a._strides:', a._strides
> b= _gen.ravel(a)
> print 'In ts b._strides:', b._strides       #  <<< Unchanged with 
> special, OK with NumArray
> print 'b:', b
> 
> 
> 
> USING THE SUBCLASS special
>  >C:\Progra~1\Python23\pythonw -u ts.py
> In ts a._strides: (8, 4)
> In setShape self._shape: (4,)
> In ts b._strides: (8, 4)
> b: In setShape self._shape: (4,)
> Traceback (most recent call last):
>   File "ts.py", line 37, in ?
>     print 'b:', b
>   File 
> "C:\PROGRA~1\Python23\lib\site-packages\numarray\numarraycore.py", line 
> 618, in __str__
>     MAX_LINE_WIDTH, PRECISION, SUPPRESS_SMALL, ' ', "")
>   File "C:\PROGRA~1\Python23\lib\site-packages\numarray\arrayprint.py", 
> line 176, in array2string
>     separator, prefix)
>   File "C:\PROGRA~1\Python23\lib\site-packages\numarray\arrayprint.py", 
> line 138, in _array2string
>     max_str_len = max(len(str(max_reduce(data))),
> libnumarray.error: maximum_Int32_reduce: access beyond buffer. offset=27 
> buffersize=16
>  >Exit code: 1
> __________________________________________________________
> 
> # USING NumArray
> 
> In setShape self._shape: (2, 2)
> In ts a._strides: (8, 4)
> In setShape self._shape: (4,)
> In ts b._strides: (4,)
> b: In setShape self._shape: (4,)
> [1 2 3 4]
>  >Exit code: 0
> 
> 
> 
> 
> -------------------------------------------------------
> This sf.net email is sponsored by:ThinkGeek
> Welcome to geek heaven.
> http://thinkgeek.com/sf
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/numpy-discussion
-- 
Todd Miller 			jmiller at stsci.edu
STSCI / ESS / SSB





More information about the NumPy-Discussion mailing list