[Numpy-discussion] all elements equal

Olivier Delalleau shish at keba.be
Mon Mar 5 14:33:23 EST 2012


Le 5 mars 2012 14:29, Keith Goodman <kwgoodman at gmail.com> a écrit :

> On Mon, Mar 5, 2012 at 11:24 AM, Neal Becker <ndbecker2 at gmail.com> wrote:
> > Keith Goodman wrote:
> >
> >> On Mon, Mar 5, 2012 at 11:14 AM, Neal Becker <ndbecker2 at gmail.com>
> wrote:
> >>> What is a simple, efficient way to determine if all elements in an
> array (in
> >>> my case, 1D) are equal?  How about close?
> >>
> >> For the exactly equal case, how about:
> >>
> >> I[1] a = np.array([1,1,1,1])
> >> I[2] np.unique(a).size
> >> O[2] 1    # All equal
> >>
> >> I[3] a = np.array([1,1,1,2])
> >> I[4] np.unique(a).size
> >> O[4] 2   # All not equal
> >
> > I considered this - just not sure if it's the most efficient
>
> Yeah, it is slow:
>
> I[1] a = np.ones(100000)
> I[2] timeit np.unique(a).size
> 1000 loops, best of 3: 1.56 ms per loop
> I[3] timeit (a == a[0]).all()
> 1000 loops, best of 3: 203 us per loop
>
> I think all() short-circuits for bool arrays:
>
> I[4] a[1] = 9
> I[5] timeit (a == a[0]).all()
> 10000 loops, best of 3: 89 us per loop
>
> You could avoid making the bool array by writing a function in cython.
> It could grab the first array element and then return False as soon as
> it finds an element that is not equal to it. And you could check for
> closeness.
>
> Or:
>
> I[8] np.allclose(a, a[0])
> O[8] False
> I[9] a = np.ones(100000)
> I[10] np.allclose(a, a[0])
> O[10] True
>

Looks like the following is even faster:
np.max(a) == np.min(a)

-=- Olivier
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20120305/9ef1b217/attachment.html>


More information about the NumPy-Discussion mailing list