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... Further, I don't believe this requirement is unique. I would think it would be needed for any time when a user wants to create a function that can accept a numpy array, and would like to avoid unnecessary data conversion. This is particularly true when the underlying function is using c++ templates to allow the data type to be a template parameter (and so can operate on any - or a range - of data types). _______________________________________________ Numpy-discussion mailing list [email protected] http://projects.scipy.org/mailman/listinfo/numpy-discussion
