Skip to content

Commit 73c5325

Browse files
committed
min,max,argmin,argmax,nanmin,nanmax,nanargmin,nanargmax
1 parent 7bd93c7 commit 73c5325

File tree

4 files changed

+109
-1
lines changed

4 files changed

+109
-1
lines changed

quantities/quantity.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,14 @@ def max(self, axis=None, out=None):
486486
copy=False
487487
)
488488

489+
@with_doc(np.nanmax)
490+
def nanmax(self, axis=None, out=None):
491+
return Quantity(
492+
np.nanmax(self.magnitude),
493+
self.dimensionality,
494+
copy=False
495+
)
496+
489497
@with_doc(np.ndarray.min)
490498
def min(self, axis=None, out=None):
491499
return Quantity(
@@ -494,10 +502,30 @@ def min(self, axis=None, out=None):
494502
copy=False
495503
)
496504

505+
@with_doc(np.nanmin)
506+
def nanmin(self, axis=None, out=None):
507+
return Quantity(
508+
np.nanmin(self.magnitude),
509+
self.dimensionality,
510+
copy=False
511+
)
512+
497513
@with_doc(np.ndarray.argmin)
498514
def argmin(self,axis=None, out=None):
499515
return self.magnitude.argmin()
500516

517+
@with_doc(np.ndarray.argmax)
518+
def argmax(self,axis=None, out=None):
519+
return self.magnitude.argmax()
520+
521+
@with_doc(np.nanargmin)
522+
def nanargmin(self,axis=None, out=None):
523+
return np.nanargmin(self.magnitude)
524+
525+
@with_doc(np.nanargmax)
526+
def nanargmax(self,axis=None, out=None):
527+
return np.nanargmax(self.magnitude)
528+
501529
@with_doc(np.ndarray.ptp)
502530
def ptp(self, axis=None, out=None):
503531
return Quantity(

quantities/tests/test_methods.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from .. import units as pq
44
from .common import TestCase
5-
5+
import numpy as np
66

77
class TestQuantityMethods(TestCase):
88

@@ -109,15 +109,31 @@ def test_nonzero(self):
109109
def test_max(self):
110110
self.assertQuantityEqual(self.q.max(), 4*pq.m)
111111

112+
def test_nanmax(self):
113+
q = np.append(self.q, np.nan) * self.q.units
114+
self.assertQuantityEqual(q.nanmax(), 4*pq.m)
115+
112116
def test_argmax(self):
113117
self.assertEqual(self.q.argmax(), 3)
114118

119+
def test_nanargmax(self):
120+
q = np.append(self.q, np.nan) * self.q.units
121+
self.assertEqual(self.q.nanargmax(), 3)
122+
115123
def test_min(self):
116124
self.assertEqual(self.q.min(), 1 * pq.m)
117125

126+
def test_nanmin(self):
127+
q = np.append(self.q, np.nan) * self.q.units
128+
self.assertQuantityEqual(q.nanmin(), 1*pq.m)
129+
118130
def test_argmin(self):
119131
self.assertEqual(self.q.argmin(), 0)
120132

133+
def test_nanargmax(self):
134+
q = np.append(self.q, np.nan) * self.q.units
135+
self.assertEqual(self.q.nanargmin(), 0)
136+
121137
def test_ptp(self):
122138
self.assertQuantityEqual(self.q.ptp(), 3 * pq.m)
123139

quantities/tests/test_uncertainty.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,31 @@ def test_uncertainty_nansum(self):
8888
uq_nan = UncertainQuantity([1,2,np.nan], 'm', [1,1,np.nan])
8989
self.assertQuantityEqual(np.sum(uq), np.nansum(uq))
9090
self.assertQuantityEqual(np.sum(uq), np.nansum(uq_nan))
91+
92+
def test_uncertainty_minmax_nan_arg(self):
93+
q = [1,2] * pq.m
94+
# quantity
95+
self.assertQuantityEqual(q.min(), 1*pq.m) # min
96+
self.assertQuantityEqual(q.max(), 2*pq.m) # max
97+
self.assertQuantityEqual(q.argmin(), 0) # argmin
98+
self.assertQuantityEqual(q.argmax(), 1) # argmax
99+
# uncertain quantity
100+
uq = UncertainQuantity([1,2], pq.m, [1,1])
101+
self.assertQuantityEqual(uq.min(), 1*pq.m) # min
102+
self.assertQuantityEqual(uq.max(), 2*pq.m) # max
103+
self.assertQuantityEqual(uq.argmin(), 0) # argmin
104+
self.assertQuantityEqual(uq.argmax(), 1) # argmax
105+
# now repeat the above with NaNs
106+
nanq = [1,2, np.nan] * pq.m
107+
nanuq = UncertainQuantity([1,2, np.nan], pq.m, [1,1,np.nan])
108+
self.assertQuantityEqual(nanq.nanmin(), 1*pq.m) # min
109+
self.assertQuantityEqual(nanq.nanmax(), 2*pq.m) # max
110+
self.assertQuantityEqual(nanq.nanargmin(), 0) # argmin
111+
self.assertQuantityEqual(nanq.nanargmax(), 1) # argmax
112+
self.assertQuantityEqual(nanuq.nanmin(), 1*pq.m) # min
113+
self.assertQuantityEqual(nanuq.nanmax(), 2*pq.m) # max
114+
self.assertQuantityEqual(nanuq.nanargmin(), 0) # argmin
115+
self.assertQuantityEqual(nanuq.nanargmax(), 1) # argmax
116+
117+
118+

quantities/uncertainquantity.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,42 @@ def nanmean(self, axis=None, dtype=None, out=None):
241241
def sqrt(self, out=None):
242242
return self**0.5
243243

244+
@with_doc(np.ndarray.max)
245+
def max(self, axis=None, out=None):
246+
idx = np.argmax(self.magnitude)
247+
return self[idx]
248+
249+
@with_doc(np.nanmax)
250+
def nanmax(self, axis=None, out=None):
251+
idx = np.nanargmax(self.magnitude)
252+
return self[idx]
253+
254+
@with_doc(np.ndarray.min)
255+
def min(self, axis=None, out=None):
256+
idx = np.argmin(self.magnitude)
257+
return self[idx]
258+
259+
@with_doc(np.nanmin)
260+
def nanmin(self, axis=None, out=None):
261+
idx = np.nanargmin(self.magnitude)
262+
return self[idx]
263+
264+
@with_doc(np.ndarray.argmin)
265+
def argmin(self,axis=None, out=None):
266+
return self.magnitude.argmin()
267+
268+
@with_doc(np.ndarray.argmax)
269+
def argmax(self,axis=None, out=None):
270+
return self.magnitude.argmax()
271+
272+
@with_doc(np.nanargmin)
273+
def nanargmin(self,axis=None, out=None):
274+
return np.nanargmin(self.magnitude)
275+
276+
@with_doc(np.nanargmax)
277+
def nanargmax(self,axis=None, out=None):
278+
return np.nanargmax(self.magnitude)
279+
244280
def __getstate__(self):
245281
"""
246282
Return the internal state of the quantity, for pickling

0 commit comments

Comments
 (0)