error using all()/numpy [TypeError: cannot perform reduce with flexible type]

Gary Herron gherron at islandtraining.com
Fri May 23 03:36:20 EDT 2008


Marc Oldenhof wrote:
> Hello all,
>
> I'm pretty new to Python, but use it a lot lately. I'm getting a crazy
> error trying to do operations on a string list after importing numpy.
> Minimal example:
>
> [start Python]
>
> Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit
> (Intel)] on win32
> Type "help", "copyright", "credits" or "license" for more information.
>
>   
>>>> a=['1','2','3']
>>>> all(a)
>>>>         
> True
>   
>>>> from numpy import *
>>>> all(a)
>>>>         
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
>   File "C:\Python25\lib\site-packages\numpy\core\fromnumeric.py", line
> 982, in all
>     return _wrapit(a, 'all', axis, out)
>   File "C:\Python25\lib\site-packages\numpy\core\fromnumeric.py", line
> 37, in _wrapit
>     result = getattr(asarray(obj),method)(*args, **kwds)
> TypeError: cannot perform reduce with flexible type
>
> [end of example]
>
> It seems that Python calls numpy's "all" instead of the standard one,
> is that right? If so, how can I call the standard "all" after the
> numpy import? ["import numpy" is not a desirable option, I use a lot
> of math in my progs]
>
> Is there another way around this error?
>   

Yes, there are several solutions, but before that I'll say that "from 
... import *" is frowned upon for just this reason.   You have no 
control (and often no idea) what * ends up importing, and if any of 
those names overwrite an existing name (as you've found here), you may 
not notice.    (It's not quite fair to say "Python calls numpy's "all".  
*You* call it after you chose to replace Python's "all" with numpy's "all".)

Solutions:



Save Python's "all" first under another name:
    original_all = all
    from numpy import all
Now you can call all(...) or original_all(...).



The built-in (as they are called) are always available through __builtins__:
    from numpy import *
    all(...)  # is numpy's all
    __builtins__.all(...)  # Is the original all




Don't import *, but rather import only those things you need.
    from numpy import array, dot, float32, int32, ...
and if you need numpy's all
    from numpy import all as numpy_all


Gary Herron




> Marc
> --
> http://mail.python.org/mailman/listinfo/python-list
>   




More information about the Python-list mailing list