as a newby to python but otherwise not totally unexperienced programmer, I would like to bring up the question once more how I can best determine if a function argument is a) scalar or vector, and b) a "simple" python float or a numpy float type.
The previous post on this topic had a simple function "twice (x)" which can easily be vectorized through list comprehension, for example. In my case, I am working on a function that converts wind direction and speed to vector components u and v (and its inverse counterpart). This entails a couple of "if" checks and more than one line of code.
I wish to apply this function either in a "pocket calculator" fashion, where a user can call it with simple scalar arguments (example: print ddff_to_uv(230.,8.5)) or in other programs which might read very lengthy data vectors (for example from a weather model) nand these would typically be numpy ndarrays then.
As far as I can see, the easiest solution would be to simply package any argument into an ndarray:
Expand|Select|Wrap|Line Numbers
- def ddff_to_uv(dd, ff):
- mydd = np.array(dd)
- myff = np.array(ff)
If I want to be more smart about this, I don't see a good way of testing yet:
* checking dd.size only works if dd is a numpy array or float (other types are not of interest), a common python float doesn't have a size attribute.
* testing for isinstance(dd, list) doesn't work on a numpy array.
* testing for isinstance(dd, (list, ndarray)) could work, but then there may well be other derived types coming up which I don't know about yet.
* hasattr(dd, '__iter__') would return true for both an ndarray and a python list; so this seems to point in the right direction. But I cannot use array syntax on a python list of float values, so I would need to convert them into ndarray first -- which again seems inefficient if dd already is an ndarray.
My present solution is the following function:
Expand|Select|Wrap|Line Numbers
- import numpy as np
- def isvector(arg):
- res = 0
- if hasattr(arg, "__iter__"): res = 1
- if isinstance(arg, np.ndarray): res = 2
- return res
Any comments or siggestions for improvement?