Skip to content

Commit 5caf4c9

Browse files
committed
BUG: Make median work for empty arrays (issue numpy#6462)
np.median([]) returns NaN. Fixes bug/regression that raised an IndexError. Added tests to ensure continued support of empty arrays.
1 parent 17146b2 commit 5caf4c9

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

numpy/lib/function_base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3339,7 +3339,7 @@ def _median(a, axis=None, out=None, overwrite_input=False):
33393339
indexer[axis] = slice(index-1, index+1)
33403340

33413341
# Check if the array contains any nan's
3342-
if np.issubdtype(a.dtype, np.inexact):
3342+
if np.issubdtype(a.dtype, np.inexact) and sz > 0:
33433343
# warn and return nans like mean would
33443344
rout = mean(part[indexer], axis=axis, out=out)
33453345
part = np.rollaxis(part, axis, part.ndim)

numpy/lib/tests/test_function_base.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2597,6 +2597,34 @@ def test_nan_behavior(self):
25972597
assert_equal(np.median(a, (0, 2)), b)
25982598
assert_equal(len(w), 1)
25992599

2600+
def test_empty(self):
2601+
# empty arrays
2602+
a = np.array([], dtype=float)
2603+
with warnings.catch_warnings(record=True) as w:
2604+
warnings.filterwarnings('always', '', RuntimeWarning)
2605+
assert_equal(np.median(a), np.nan)
2606+
assert_(w[0].category is RuntimeWarning)
2607+
2608+
# multiple dimensions
2609+
a = np.array([], dtype=float, ndmin=3)
2610+
# no axis
2611+
with warnings.catch_warnings(record=True) as w:
2612+
warnings.filterwarnings('always', '', RuntimeWarning)
2613+
assert_equal(np.median(a), np.nan)
2614+
assert_(w[0].category is RuntimeWarning)
2615+
2616+
# axis 0 and 1
2617+
b = np.array([], dtype=float, ndmin=2)
2618+
assert_equal(np.median(a, axis=0), b)
2619+
assert_equal(np.median(a, axis=1), b)
2620+
2621+
# axis 2
2622+
b = np.array(np.nan, dtype=float, ndmin=2)
2623+
with warnings.catch_warnings(record=True) as w:
2624+
warnings.filterwarnings('always', '', RuntimeWarning)
2625+
assert_equal(np.median(a, axis=2), b)
2626+
assert_(w[0].category is RuntimeWarning)
2627+
26002628
def test_object(self):
26012629
o = np.arange(7.)
26022630
assert_(type(np.median(o.astype(object))), float)

0 commit comments

Comments
 (0)