[Numpy-discussion] all elements equal

2012-03-05 Thread Neal Becker
What is a simple, efficient way to determine if all elements in an array (in my 
case, 1D) are equal?  How about close?

___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] all elements equal

2012-03-05 Thread Keith Goodman
On Mon, Mar 5, 2012 at 11:14 AM, Neal Becker ndbeck...@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
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] all elements equal

2012-03-05 Thread Neal Becker
Keith Goodman wrote:

 On Mon, Mar 5, 2012 at 11:14 AM, Neal Becker ndbeck...@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

___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] all elements equal

2012-03-05 Thread Zachary Pincus
How about the following?
exact: numpy.all(a == a[0])
inexact: numpy.allclose(a, a[0])

On Mar 5, 2012, at 2:19 PM, Keith Goodman wrote:

 On Mon, Mar 5, 2012 at 11:14 AM, Neal Becker ndbeck...@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
 ___
 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


Re: [Numpy-discussion] all elements equal

2012-03-05 Thread John Hunter
On Mon, Mar 5, 2012 at 1:29 PM, Keith Goodman kwgood...@gmail.com wrote:


 I[8] np.allclose(a, a[0])
 O[8] False
 I[9] a = np.ones(10)
 I[10] np.allclose(a, a[0])
 O[10] True


One disadvantage of using a[0] as a proxy is that the result depends on the
ordering of a

  (a.max() - a.min())  epsilon

is an alternative that avoids this.  Another good use case for a minmax
func.
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] all elements equal

2012-03-05 Thread Olivier Delalleau
Le 5 mars 2012 14:29, Keith Goodman kwgood...@gmail.com a écrit :

 On Mon, Mar 5, 2012 at 11:24 AM, Neal Becker ndbeck...@gmail.com wrote:
  Keith Goodman wrote:
 
  On Mon, Mar 5, 2012 at 11:14 AM, Neal Becker ndbeck...@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(10)
 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()
 1 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(10)
 I[10] np.allclose(a, a[0])
 O[10] True


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

-=- Olivier
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] all elements equal

2012-03-05 Thread josef . pktd
On Mon, Mar 5, 2012 at 2:33 PM, Olivier Delalleau sh...@keba.be wrote:
 Le 5 mars 2012 14:29, Keith Goodman kwgood...@gmail.com a écrit :

 On Mon, Mar 5, 2012 at 11:24 AM, Neal Becker ndbeck...@gmail.com wrote:
  Keith Goodman wrote:
 
  On Mon, Mar 5, 2012 at 11:14 AM, Neal Becker ndbeck...@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(10)
 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()
 1 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(10)
 I[10] np.allclose(a, a[0])
 O[10] True


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

How about numpy.ptp, to follow this line? I would expect it's single
pass, but wouldn't short circuit compared to cython of Keith

Josef



 -=- Olivier

 ___
 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


Re: [Numpy-discussion] all elements equal

2012-03-05 Thread Keith Goodman
On Mon, Mar 5, 2012 at 11:36 AM,  josef.p...@gmail.com wrote:
 How about numpy.ptp, to follow this line? I would expect it's single
 pass, but wouldn't short circuit compared to cython of Keith

I[1] a = np.ones(10)
I[2] timeit (a == a[0]).all()
1000 loops, best of 3: 203 us per loop
I[3] timeit a.min() == a.max()
1 loops, best of 3: 106 us per loop
I[4] timeit np.ptp(a)
1 loops, best of 3: 106 us per loop

I[5] a[1] = 9
I[6] timeit (a == a[0]).all()
1 loops, best of 3: 89.7 us per loop
I[7] timeit a.min() == a.max()
1 loops, best of 3: 102 us per loop
I[8] timeit np.ptp(a)
1 loops, best of 3: 103 us per loop
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] all elements equal

2012-03-05 Thread Benjamin Root
On Mon, Mar 5, 2012 at 1:44 PM, Keith Goodman kwgood...@gmail.com wrote:

 On Mon, Mar 5, 2012 at 11:36 AM,  josef.p...@gmail.com wrote:
  How about numpy.ptp, to follow this line? I would expect it's single
  pass, but wouldn't short circuit compared to cython of Keith

 I[1] a = np.ones(10)
 I[2] timeit (a == a[0]).all()
 1000 loops, best of 3: 203 us per loop
 I[3] timeit a.min() == a.max()
 1 loops, best of 3: 106 us per loop
 I[4] timeit np.ptp(a)
 1 loops, best of 3: 106 us per loop

 I[5] a[1] = 9
 I[6] timeit (a == a[0]).all()
 1 loops, best of 3: 89.7 us per loop
 I[7] timeit a.min() == a.max()
 1 loops, best of 3: 102 us per loop
 I[8] timeit np.ptp(a)
 1 loops, best of 3: 103 us per loop


Another issue to watch out for is if the array is empty.  Technically
speaking, that should be True, but some of the solutions offered so far
would fail in this case.

Ben Root
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] all elements equal

2012-03-05 Thread Keith Goodman
On Mon, Mar 5, 2012 at 11:52 AM, Benjamin Root ben.r...@ou.edu wrote:
 Another issue to watch out for is if the array is empty.  Technically
 speaking, that should be True, but some of the solutions offered so far
 would fail in this case.

Good point.

For fun, here's the speed of a simple cython allclose:

I[2] a = np.ones(10)
I[3] timeit a.min() == a.max()
1 loops, best of 3: 106 us per loop
I[4] timeit allequal(a)
1 loops, best of 3: 68.9 us per loop

I[5] a[1] = 9
I[6] timeit a.min() == a.max()
1 loops, best of 3: 102 us per loop
I[7] timeit allequal(a)
100 loops, best of 3: 269 ns per loop

where

@cython.boundscheck(False)
@cython.wraparound(False)
def allequal(np.ndarray[np.float64_t, ndim=1] a):
cdef:
np.float64_t a0
Py_ssize_t i, n=a.size
a0 = a[0]
for i in range(n):
if a[i] != a0:
return False
return True
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] all elements equal

2012-03-05 Thread Brett Olsen
 Another issue to watch out for is if the array is empty.  Technically
 speaking, that should be True, but some of the solutions offered so far
 would fail in this case.

Similarly, NaNs or Infs could cause problems:  they should signal as
False, but several of the solutions would return True.

~Brett
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] all elements equal

2012-03-05 Thread Neal Becker
Keith Goodman wrote:

 On Mon, Mar 5, 2012 at 11:52 AM, Benjamin Root ben.r...@ou.edu wrote:
 Another issue to watch out for is if the array is empty.  Technically
 speaking, that should be True, but some of the solutions offered so far
 would fail in this case.
 
 Good point.
 
 For fun, here's the speed of a simple cython allclose:
 
 I[2] a = np.ones(10)
 I[3] timeit a.min() == a.max()
 1 loops, best of 3: 106 us per loop
 I[4] timeit allequal(a)
 1 loops, best of 3: 68.9 us per loop
 
 I[5] a[1] = 9
 I[6] timeit a.min() == a.max()
 1 loops, best of 3: 102 us per loop
 I[7] timeit allequal(a)
 100 loops, best of 3: 269 ns per loop
 
 where
 
 @cython.boundscheck(False)
 @cython.wraparound(False)
 def allequal(np.ndarray[np.float64_t, ndim=1] a):
 cdef:
 np.float64_t a0
 Py_ssize_t i, n=a.size
 a0 = a[0]
 for i in range(n):
 if a[i] != a0:
 return False
 return True

But doesn't this one fail on empty array?

___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] all elements equal

2012-03-05 Thread Keith Goodman
On Mon, Mar 5, 2012 at 12:06 PM, Neal Becker ndbeck...@gmail.com wrote:
 But doesn't this one fail on empty array?

Yes. I'm optimizing for fun, not for corner cases. This should work
for size zero and NaNs:

@cython.boundscheck(False)
@cython.wraparound(False)
def allequal(np.ndarray[np.float64_t, ndim=1] a):
cdef:
np.float64_t a0
Py_ssize_t i, n=a.size
if n == 0:
return False # Or would you like True?
a0 = a[0]
for i in range(n):
if a[i] != a0:
return False
return True
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] all elements equal

2012-03-05 Thread Keith Goodman
On Mon, Mar 5, 2012 at 12:12 PM, Keith Goodman kwgood...@gmail.com wrote:
 On Mon, Mar 5, 2012 at 12:06 PM, Neal Becker ndbeck...@gmail.com wrote:
 But doesn't this one fail on empty array?

 Yes. I'm optimizing for fun, not for corner cases. This should work
 for size zero and NaNs:

 @cython.boundscheck(False)
 @cython.wraparound(False)
 def allequal(np.ndarray[np.float64_t, ndim=1] a):
    cdef:
        np.float64_t a0
        Py_ssize_t i, n=a.size
    if n == 0:
        return False # Or would you like True?
    a0 = a[0]
    for i in range(n):
        if a[i] != a0:
            return False
    return True

Sorry for all the posts. I'll go back to being quiet. Seems like
np.allclose returns True for empty arrays:

I[2] a = np.array([])
I[3] np.allclose(np.array([]), np.array([]))
O[3] True

The original allequal cython code did the same:

I[4] allequal(a)
O[4] True
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion