Skip to content

Commit 28ceda0

Browse files
Statistics.nanunique: Pass all parameters to unique function call
1 parent 22dbc3c commit 28ceda0

File tree

2 files changed

+29
-10
lines changed

2 files changed

+29
-10
lines changed

Orange/statistics/util.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -442,11 +442,17 @@ def unique(x, return_counts=False):
442442
return np.insert(r, zero_index, 0)
443443

444444

445-
def nanunique(x):
445+
def nanunique(*args, **kwargs):
446446
""" Return unique values while disregarding missing (np.nan) values.
447447
Supports sparse or dense matrices. """
448-
r = unique(x)
449-
return r[~np.isnan(r)]
448+
result = unique(*args, **kwargs)
449+
450+
if isinstance(result, tuple):
451+
result, counts = result
452+
non_nan_mask = ~np.isnan(result)
453+
return result[non_nan_mask], counts[non_nan_mask]
454+
455+
return result[~np.isnan(result)]
450456

451457

452458
def digitize(x, bins, right=False):

Orange/tests/test_statistics.py

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -126,13 +126,6 @@ def test_nanmin_nanmax(self):
126126
nanmax(X_sparse, axis=axis),
127127
np.nanmax(X, axis=axis))
128128

129-
def test_nanunique(self):
130-
x = csr_matrix(np.array([0, 1, 1, np.nan]))
131-
np.testing.assert_array_equal(
132-
nanunique(x),
133-
np.array([0, 1])
134-
)
135-
136129
def test_mean(self):
137130
for X in self.data:
138131
X_sparse = csr_matrix(X)
@@ -415,3 +408,23 @@ def test_sparse_explicit_zeros(self):
415408
unique(y, return_counts=True),
416409
unique(x, return_counts=True),
417410
)
411+
412+
@dense_sparse
413+
def test_nanunique_ignores_nans_in_values(self, array):
414+
# pylint: disable=bad-whitespace
415+
x = array([[-1., 1., 0., 2., 3., np.nan],
416+
[ 0., 0., 0., 3., 5., np.nan],
417+
[-1., 0., 0., 1., 7., 6.]])
418+
expected = [-1, 0, 1, 2, 3, 5, 6, 7]
419+
420+
np.testing.assert_equal(nanunique(x, return_counts=False), expected)
421+
422+
@dense_sparse
423+
def test_nanunique_ignores_nans_in_counts(self, array):
424+
# pylint: disable=bad-whitespace
425+
x = array([[-1., 1., 0., 2., 3., np.nan],
426+
[ 0., 0., 0., 3., 5., np.nan],
427+
[-1., 0., 0., 1., 7., 6.]])
428+
expected = [2, 6, 2, 1, 2, 1, 1, 1]
429+
430+
np.testing.assert_equal(nanunique(x, return_counts=True)[1], expected)

0 commit comments

Comments
 (0)