On Sun, May 29, 2011 at 10:58 PM, Chris Barker <chris.bar...@noaa.gov>wrote:

> > On 5/28/2011 3:40 PM, Robert wrote:
> >> (myarray in mylist) turns into mylist.__contains__(myarray).
> >> Only the list object is ever checked for this method. There is no
> >> paired method myarray.__rcontains__(mylist) so there is nothing that
> >> numpy can override to make this operation do anything different from
> >> what lists normally do,
>
> however, numpy arrays should be able to override "in" be defining their
> own.__contains__ method, so you could do:
>
> something in an_array
>
> and get a useful, vectorized result.
>
> So I thought I'd see what currently happens when I try that:
>
> In [24]: a
> Out[24]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
>
> In [25]: 3 in a
> Out[25]: True
>
> So the simple case works just like a list. But what If I want what the
> OP wants:
>
> In [26]: b
> Out[26]: array([3, 6, 4])
>
> In [27]: b in a
> Out[27]: False
>
> OK, so the full b array is not in a, and it doesn't "vectorize" it,
> either. But:
>
> In [29]: a
> Out[29]:
> array([[ 0,  1,  2],
>        [ 3,  4,  5],
>        [ 6,  7,  8],
>        [ 9, 10, 11]])
>
> In [30]: b in a
> Out[30]: True
>
> HUH?
>
> I'm not sure by what definition we would say that b is contained in a.
>
> but maybe..
>
> In [41]: b
> Out[41]: array([  4,   2, 345])
>
> In [42]: b in a
> Out[42]: False
>
> so it's "are all of the elements in b in a somewhere?" but only for 2-d
> arrays?
>
>
> So what does it mean?
>
FWIW, a short prelude on the theme seems quite promising, indeed:
In []: A
Out[]:
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
In []: [0, 1, 2] in A
Out[]: True
In []: [0, 3, 6] in A
Out[]: True
In []: [0, 4, 8] in A
Out[]: True
In []: [8, 4, 0] in A
Out[]: True
In []: [2, 4, 6] in A
Out[]: True
In []: [6, 4, 2] in A
Out[]: True
In []: [3, 1, 5] in A
Out[]: True
In [1061]: [3, 1, 4] in A
Out[1061]: True
But
In []: [1, 2, 3] in A
Out[]: False
In []: [3, 2, 1] in A
Out[]: True

So, obviously the logic behind __contains__ is not so very straightforward.
Perhaps just a bug?

Regards,
eat

>
> The docstring is not helpful:
>
> In [58]: np.ndarray.__contains__?
> Type:           wrapper_descriptor
> Base Class:     <type 'wrapper_descriptor'>
> String Form:    <slot wrapper '__contains__' of 'numpy.ndarray' objects>
> Namespace:      Interactive
> Docstring:
>     x.__contains__(y) <==> y in x
>
>
> If nothing useful, maybe it could provide a vectorized version of "in"
> for this sort of use case.
>
> -Chris
>
>
>
>
>
>
> --
> Christopher Barker, Ph.D.
> Oceanographer
>
> Emergency Response Division
> NOAA/NOS/OR&R            (206) 526-6959   voice
> 7600 Sand Point Way NE   (206) 526-6329   fax
> Seattle, WA  98115       (206) 526-6317   main reception
>
> chris.bar...@noaa.gov
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion@scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to