[Numpy-discussion] casting

Robert Kern robert.kern@gmail....
Mon Jan 14 10:07:30 CST 2008


Neal Becker wrote:
> Robert Kern wrote:
> 
>> Neal Becker wrote:
>>> numpy frequently refers to 'casting'.  I'm not sure if that term is ever
>>> defined.  I believe it has the same meaning as in C.  In that case, it is
>>> unfortunately used to mean 2 different things.  There are casts that do
>>> not change the underlying bits (such as a pointer cast), and there are
>>> casts that actually convert to different bits (such as float -> double).
>>>
>>> I think numpy means the latter.  When an array where the underlying data
>>> is one type, a cast to another type means actually reallocating and
>>> converting the data.
>> Yes, that is usually what people mean when they use _casting_ in the
>> context of numpy. It is the more frequently performed operation of the
>> two. The former can be accomplished with the .view(dtype) method of
>> ndarrays.
>>
>>> It often occurs that I have an algorithm that can take any integral type,
>>> because it is written with c++ templates.  In that case, I don't want to
>>> use PyArray_FROMANY, because I don't want to unecessarily convert the
>>> array
>>> data.  Instead, I'd like to inquire what is the preferred type of the
>>> data.
>>>
>>> The solution I'm exploring is to use a function I
>>> call 'preferred_array_type'.  This uses the __array_struct__ interface to
>>> find the native data type.  I chose to use this interface, because then
>>> it will work with both numpy arrays and other array-like types.
>>>
>>> Any thoughts on all of this?
>> I'm not sure what you mean by "preferred type of the data". Do you mean
>> the dtype of the array as it comes in? There are several functions and
>> function macros in the numpy C API which take differing amounts of
>> information. For example,
>>
>>   * PyArray_FROM_O(PyObject*onj) just takes an object.
>>   * PyArray_FROM_OF(PyObject* obj, int req) takes an object and flags like
>>     NPY_CONTIGUOUS.
>>   * PyArray_FROM_OT(PyObject* obj, int typenum) takes an object and a type
>>     number.
>>   * PyArray_FROM_OTF(PyObject* obj, int typenum, int req) takes an object,
>>   type,
>>     and flags.
>>
> 
> Let me try again to explain.  I don't want to convert to some type first -
> that would be a waste.  I need to find out what is the native data type of
> the input array first.  Also, I'd like to allow that the input is not a
> PyArray, but could be something conforming to __array_struct__ interface. 
> So, I need to find the native data type _first_, _then_ call the
> appropriate PyArray_FROM...

I'm sorry, I still think we're talking past each other. What do you mean by 
"native data type"? If you just want to get an ndarray without specifying a 
type, use PyArray_FROM_O(). That's what it's for. You don't need to know the 
data type beforehand.

-- 
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