[SciPy-dev] Some suggestions for scipy_core
Travis E. Oliphant
oliphant.travis at ieee.org
Sun Jan 1 22:34:01 EST 2006
Francesc Altet wrote:
> Hi,
>
> I've started looking at giving suport of scipy_core objects into
> PyTables. I begun by homogenous array (not chararrays or recarrays
> yet), and discovered some issues that perhaps can be improved in
> scipy_core:
>
> 1.- Is there any reason for this?
>
> In [67]: type(scicore.array(3, dtype='D'))
> Out[67]: <type 'scipy.ndarray'>
>
> In [68]: type(scicore.array(3).astype('D'))
> Out[68]: <type 'complex128_arrtype'> !!!!!!!!
>
The reason is that you are getting an "array scalar" because
0-dimensional arrays are only returned from the array function, itself.
All other functions return array scalars.
Please note that complex128_arrtype is an actual python type object that
can hold a single item of the array.
>
> 2.- For the sake of compatibility with numarray, I'm wondering if you
> can include entries in the typeDict dictionary that follows numarray
> conventions.
>
> In [98]: scicore.typeDict['UInt16']
> ---------------------------------------------------------------------------
> exceptions.KeyError Traceback (most
> recent call last)
>
> /home/faltet/python.nobackup/scipy_core/<console>
>
> KeyError: 'UInt16'
>
> However, this exists:
>
> In [99]: scicore.typeDict['Uint16']
> Out[99]: <type 'uint16_arrtype'>
This is a mistake. Uint16 should *be* UInt16. That is one of the big
purposes of typeDict (compatibility with numarray).
>
> Also, for numarray compatibility, could 'complexXXX' --> 'ComplexXXX'
> be made? And add a 'Bool'? I know that a type 'Bool8' exists, but
> perhaps 'Bool' can be added as an alias of 'Bool8'.
Sounds fine on the Bool. But, note that unlike in numarray, the
lower-case types are actual Python type objects. The capitalized names
are just string typecodes. Also, ComplexXXX uses the old (bit-width of
the float) convention for backwards compatibility, whereas the new
complexXXX names use item-bit-width convention.
>
> 3.- Finally, I'd advocate to have a more handy string representation
> for .dtype. Right now, one have:
>
> In [117]: a.dtype
> --------> a.dtype()
> Out[117]: 0
>
> (why dtype supports the call protocol? Is it really necessary?)
>
Because it's an actual type object. I think we could disable the tp_new
method of the type. Curently, this allows you do say int32([1,2,3,4])
to construct an array.
> In [118]: str(a.dtype)
> Out[118]: "<type 'int32_arrtype'>"
>
> In [121]: repr(a.dtype)
> Out[121]: "<type 'int32_arrtype'>"
This would require creating a new metaclass because a.dtype is a
typeobject and so prints using the standard type object printing. We
would have to inherit from the typeobject to change that standard.
I think rather than shield people from the idea that dtype is an actual
typeobject (which changing the printing would do) we should emphaize
that fact.
Thanks for your suggestions.
-Travis
More information about the SciPy-Dev
mailing list