diff options
author | Pieter Eendebak <pieter.eendebak@gmail.com> | 2022-07-18 21:54:00 +0200 |
---|---|---|
committer | Pieter Eendebak <pieter.eendebak@gmail.com> | 2022-08-10 23:46:37 +0200 |
commit | 25d5e385ec537f911702f905ca050815e320865a (patch) | |
tree | ed42a135529a2a086ffcd7013fa9bb56f6b380a8 /numpy | |
parent | 86a368f53ba15a610be4c6cb3a173446aef3aa80 (diff) | |
download | numpy-25d5e385ec537f911702f905ca050815e320865a.tar.gz |
BUG: fix np.average for Fraction elements
Diffstat (limited to 'numpy')
-rw-r--r-- | numpy/lib/function_base.py | 9 | ||||
-rw-r--r-- | numpy/lib/tests/test_function_base.py | 5 |
2 files changed, 10 insertions, 4 deletions
diff --git a/numpy/lib/function_base.py b/numpy/lib/function_base.py index fb5dd6fdd..960285f7d 100644 --- a/numpy/lib/function_base.py +++ b/numpy/lib/function_base.py @@ -516,7 +516,8 @@ def average(a, axis=None, weights=None, returned=False, *, if weights is None: avg = a.mean(axis, **keepdims_kw) - scl = avg.dtype.type(a.size/avg.size) + avg_as_array = np.asanyarray(avg) + scl = avg_as_array.dtype.type(a.size/avg_as_array.size) else: wgt = np.asanyarray(weights) @@ -547,12 +548,12 @@ def average(a, axis=None, weights=None, returned=False, *, raise ZeroDivisionError( "Weights sum to zero, can't be normalized") - avg = np.multiply(a, wgt, + avg = avg_as_array = np.multiply(a, wgt, dtype=result_dtype).sum(axis, **keepdims_kw) / scl if returned: - if scl.shape != avg.shape: - scl = np.broadcast_to(scl, avg.shape).copy() + if scl.shape != avg_as_array.shape: + scl = np.broadcast_to(scl, avg_as_array.shape).copy() return avg, scl else: return avg diff --git a/numpy/lib/tests/test_function_base.py b/numpy/lib/tests/test_function_base.py index 56081b4f0..277843222 100644 --- a/numpy/lib/tests/test_function_base.py +++ b/numpy/lib/tests/test_function_base.py @@ -421,6 +421,11 @@ class TestAverage: w /= w.sum() assert_almost_equal(a.mean(0), average(a, weights=w)) + def test_average_class_without_dtype(self): + # see gh-21988 + a = np.array([Fraction(1, 5), Fraction(3, 5)]) + assert_equal(np.average(a), Fraction(2, 5)) + class TestSelect: choices = [np.array([1, 2, 3]), np.array([4, 5, 6]), |