[Numpy-discussion] What should np.ndarray.__contains__ do
Sebastian Berg
sebastian at sipsolutions.net
Mon Feb 25 10:10:16 EST 2013
Hello all,
currently the `__contains__` method or the `in` operator on arrays, does
not return what the user would expect when in the operation `a in b` the
`a` is not a single element (see "In [3]-[4]" below).
The first solution coming to mind might be checking `all()` for all
dimensions given in argument `a` (see line "In [5]" for a simplistic
example). This does not play too well with broadcasting however, but one
could maybe simply *not* broadcast at all (i.e. a.shape ==
b.shape[b.ndim-a.ndim:]) and raise an error/return False otherwise.
On the other hand one could say broadcasting of `a` onto `b` should be
"any" along that dimension (see "In [8]"). The other way should maybe
raise an error though (see "In [9]" to understand what I mean).
I think using broadcasting dimensions where `a` is repeated over `b` as
the dimensions to use "any" logic on is the most general way for numpy
to handle this consistently, while the other way around could be handled
with an `all` but to me makes so little sense that I think it should be
an error. Of course this is different to a list of lists, which gives
False in these cases, but arrays are not list of lists...
As a side note, since for loop, etc. use "for item in array", I do not
think that vectorizing along `a` as np.in1d does is reasonable. `in`
should return a single boolean.
I have opened an issue for it:
https://github.com/numpy/numpy/issues/3016#issuecomment-14045545
Regards,
Sebastian
In [1]: a = np.array([0, 2])
In [2]: b = np.arange(10).reshape(5,2)
In [3]: b
Out[3]:
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
In [4]: a in b
Out[4]: True
In [5]: (b == a).any()
Out[5]: True
In [6]: (b == a).all(0).any() # the 0 could be multiple axes
Out[6]: False
In [7]: a_2d = a[None,:]
In [8]: a_2d in b # broadcast dimension means "any" -> True
Out[8]: True
In [9]: [0, 1] in b[:,:1] # should not work (or be False, not True)
Out[9]: True
More information about the NumPy-Discussion
mailing list