[Numpy-discussion] Inconsistency with __index__() for rank-1 arrays?

Francesc Alted faltet at pytables.org
Wed Oct 27 09:34:31 EDT 2010


Hi,

I find this a bit misleading:

>>> a = np.arange(10)

>>> a[np.array(0)]
0

>>> a[np.array([0])]
array([0])

>>> a[[0]]
array([0])

But, for regular python lists we have:

>>> l = a.tolist()

>>> l[np.array(0)]
0

>>> l[np.array([0])]
0

i.e. indexing with a rank-0 array and a rank-1 array with one single 
element return the same result, which I find inconsistent with the 
expected behaviour for this case, i.e.:

>>> l[[0]]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call 
last)

/tmp/tables-2.2/<ipython console> in <module>()

TypeError: list indices must be integers, not list

The ultimate reason for this behaviour is this:

>>> np.array(0).__index__()
0

>>> np.array([0]).__index__()
0

But I wonder why NumPy needs the latter behaviour, instead of the more 
logical:

>>> np.array([0]).__index__()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call 
last)

/tmp/tables-2.2/<ipython console> in <module>()

TypeError: only rank-0 integer arrays can be converted to an index

This inconsistency has indeed introduced a bug in my application and for 
solving this I'd need something like:

"""
def is_idx(index):
    """Check if an object can work as an index or not."""

    if hasattr(index, "__index__"):  # Only works on Python 2.5 on
        if (hasattr(index, "shape") and index.shape == (1,)):
            return False
        try:                           # (as per PEP 357)
            idx = index.__index__()
            return True
        except TypeError:
            return False

    return False
"""

i.e. for determining if an object can be an index or not, I need to 
explicitly check for a shape different from (1,), which is unnecessarily 
complicated.

So I find the current behaviour prone to introduce errors in apps and 
I'm wondering why exactly np.array([1]) should work as an index at all.  
It would not be better if that would raise a ``TypeError``?

Thanks,

-- 
Francesc Alted



More information about the NumPy-Discussion mailing list