diff options
author | Mark Wiebe <mwwiebe@gmail.com> | 2011-08-25 22:54:20 -0700 |
---|---|---|
committer | Charles Harris <charlesr.harris@gmail.com> | 2011-08-27 07:27:01 -0600 |
commit | b94f43da3e418b9a200bd9cf4f2193585759c32b (patch) | |
tree | 1ead527a25f8bffa46b88de127b7a4dd414523c0 /numpy | |
parent | cc326304a60c35d38dc29adf2544a29d6dcedfee (diff) | |
download | numpy-b94f43da3e418b9a200bd9cf4f2193585759c32b.tar.gz |
TST: missingdata: Write some tests for the np.any and np.all NA behavior
Diffstat (limited to 'numpy')
-rw-r--r-- | numpy/core/src/multiarray/boolean_ops.c.src | 18 | ||||
-rw-r--r-- | numpy/core/tests/test_maskna.py | 76 |
2 files changed, 87 insertions, 7 deletions
diff --git a/numpy/core/src/multiarray/boolean_ops.c.src b/numpy/core/src/multiarray/boolean_ops.c.src index da39824f0..f3d87cc34 100644 --- a/numpy/core/src/multiarray/boolean_ops.c.src +++ b/numpy/core/src/multiarray/boolean_ops.c.src @@ -29,11 +29,15 @@ /* Typedef for the reduction inner loop */ typedef void (reduce_inner_loop)(char **, npy_intp *, npy_intp); +#define ANY_COMBINE_MASK(val, mask) ((val) & (mask)) +#define ALL_COMBINE_MASK(val, mask) ((val) | ((mask) ^ 0x01)) + /**begin repeat * #oper = any, all# * #Oper = Any, All# * #Identity = Zero, One# * #combineop = |=, &=# + * #combinemask = ANY_COMBINE_MASK, ALL_COMBINE_MASK# * #shortcircuit = !value, value# * #idval = 0, 1# */ @@ -164,7 +168,7 @@ static void npy_intp i; for (i = 0; i < count; ++i) { - *data0 @combineop@ *data1 & *data2; + *data0 @combineop@ @combinemask@(*data1, *data2); data0 += stride0; data1 += stride1; @@ -182,7 +186,7 @@ static void char value = *data0; for (i = 0; i < count && @shortcircuit@; ++i) { - value @combineop@ *data1 & *data2; + value @combineop@ @combinemask@(*data1, *data2); data1 += stride1; data2 += stride2; @@ -281,9 +285,9 @@ static void * If the value is an exposed True (for any) or False (for all), * expose the result as well */ - else if (*data1 & *data3) { + else if (@combinemask@(*data1, *data3) == 1-@idval@) { *data0 = 1-@idval@; - *data2 = 1-@idval@; + *data2 = 1; } data0 += stride0; @@ -302,7 +306,7 @@ static void npy_intp stride1 = strides[1], stride3 = strides[3]; npy_intp i; char maskvalue = *data2; - char value = maskvalue ? *data0 : 0; + char value = maskvalue ? *data0 : @idval@; for (i = 0; i < count && @shortcircuit@; ++i) { /* Normal case */ @@ -313,9 +317,9 @@ static void * If the value is an exposed True (for any) or False (for all), * expose the result as well */ - else if (*data1 & *data3) { + else if (@combinemask@(*data1, *data3) == 1-@idval@) { value = 1-@idval@; - maskvalue = 1-@idval@; + maskvalue = 1; break; } diff --git a/numpy/core/tests/test_maskna.py b/numpy/core/tests/test_maskna.py index f83dab264..bbda9f5fa 100644 --- a/numpy/core/tests/test_maskna.py +++ b/numpy/core/tests/test_maskna.py @@ -1023,6 +1023,82 @@ def check_ufunc_skipna_max_3D(max_func): assert_raises(ValueError, max_func, a, axis=1, skipna=True) assert_raises(ValueError, max_func, a, axis=2, skipna=True) +def test_ufunc_ndarray_any(): + a = np.array([0,0,0,0,0], dtype='?', maskna=True) + assert_array_equal(a.any(), False) + a[0] = np.NA + assert_array_equal(a.any(), np.NA) + assert_array_equal(a.any(skipna=True), False) + a[0] = 0 + a[-1] = np.NA + assert_array_equal(a.any(), np.NA) + assert_array_equal(a.any(skipna=True), False) + a[0] = 1 + assert_array_equal(a.any(), True) + assert_array_equal(a.any(skipna=True), True) + a[-1] = 1 + a[-2] = np.NA + assert_array_equal(a.any(), True) + assert_array_equal(a.any(skipna=True), True) + + a = np.array([[0,0,0],[0,np.NA,0]], dtype='?') + assert_array_equal(a.any(axis=0), [False, np.NA, False]) + assert_array_equal(a.any(axis=1), [False, np.NA]) + assert_array_equal(a.any(axis=0, skipna=True), [False, False, False]) + assert_array_equal(a.any(axis=1, skipna=True), [False, False]) + + a[0,1] = 1 + assert_array_equal(a.any(axis=0), [False, True, False]) + assert_array_equal(a.any(axis=1), [True, np.NA]) + assert_array_equal(a.any(axis=0, skipna=True), [False, True, False]) + assert_array_equal(a.any(axis=1, skipna=True), [True, False]) + + a[0,1] = np.NA + a[1,1] = 0 + a[0,2] = 1 + assert_array_equal(a.any(axis=0), [False, np.NA, True]) + assert_array_equal(a.any(axis=1), [True, False]) + assert_array_equal(a.any(axis=0, skipna=True), [False, False, True]) + assert_array_equal(a.any(axis=1, skipna=True), [True, False]) + +def test_ufunc_ndarray_all(): + a = np.array([1,1,1,1,1], dtype='?', maskna=True) + assert_array_equal(a.all(), True) + a[0] = np.NA + assert_array_equal(a.all(), np.NA) + assert_array_equal(a.all(skipna=True), True) + a[0] = 1 + a[-1] = np.NA + assert_array_equal(a.all(), np.NA) + assert_array_equal(a.all(skipna=True), True) + a[0] = 0 + assert_array_equal(a.all(), False) + assert_array_equal(a.all(skipna=True), False) + a[-1] = 0 + a[-2] = np.NA + assert_array_equal(a.all(), False) + assert_array_equal(a.all(skipna=True), False) + + a = np.array([[1,1,1],[1,np.NA,1]], dtype='?') + assert_array_equal(a.all(axis=0), [True, np.NA, True]) + assert_array_equal(a.all(axis=1), [True, np.NA]) + assert_array_equal(a.all(axis=0, skipna=True), [True, True, True]) + assert_array_equal(a.all(axis=1, skipna=True), [True, True]) + + a[0,1] = 0 + assert_array_equal(a.all(axis=0), [True, False, True]) + assert_array_equal(a.all(axis=1), [False, np.NA]) + assert_array_equal(a.all(axis=0, skipna=True), [True, False, True]) + assert_array_equal(a.all(axis=1, skipna=True), [False, True]) + + a[0,1] = np.NA + a[1,1] = 1 + a[0,2] = 0 + assert_array_equal(a.all(axis=0), [True, np.NA, False]) + assert_array_equal(a.all(axis=1), [False, True]) + assert_array_equal(a.all(axis=0, skipna=True), [True, True, False]) + assert_array_equal(a.all(axis=1, skipna=True), [False, True]) + def test_count_reduce_items(): # np.count_reduce_items |