Skip to content

Commit bc688c8

Browse files
Statistics.nanunique: Pass all parameters to unique function call
1 parent a0b72bc commit bc688c8

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
@@ -443,11 +443,17 @@ def unique(x, return_counts=False):
443443
return np.insert(r, zero_index, 0)
444444

445445

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

452458

453459
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
@@ -130,13 +130,6 @@ def test_nanmin_nanmax(self):
130130
nanmax(X_sparse, axis=axis),
131131
np.nanmax(X, axis=axis))
132132

133-
def test_nanunique(self):
134-
x = csr_matrix(np.array([0, 1, 1, np.nan]))
135-
np.testing.assert_array_equal(
136-
nanunique(x),
137-
np.array([0, 1])
138-
)
139-
140133
def test_mean(self):
141134
for X in self.data:
142135
X_sparse = csr_matrix(X)
@@ -419,3 +412,23 @@ def test_sparse_explicit_zeros(self):
419412
unique(y, return_counts=True),
420413
unique(x, return_counts=True),
421414
)
415+
416+
@dense_sparse
417+
def test_nanunique_ignores_nans_in_values(self, array):
418+
# pylint: disable=bad-whitespace
419+
x = array([[-1., 1., 0., 2., 3., np.nan],
420+
[ 0., 0., 0., 3., 5., np.nan],
421+
[-1., 0., 0., 1., 7., 6.]])
422+
expected = [-1, 0, 1, 2, 3, 5, 6, 7]
423+
424+
np.testing.assert_equal(nanunique(x, return_counts=False), expected)
425+
426+
@dense_sparse
427+
def test_nanunique_ignores_nans_in_counts(self, array):
428+
# pylint: disable=bad-whitespace
429+
x = array([[-1., 1., 0., 2., 3., np.nan],
430+
[ 0., 0., 0., 3., 5., np.nan],
431+
[-1., 0., 0., 1., 7., 6.]])
432+
expected = [2, 6, 2, 1, 2, 1, 1, 1]
433+
434+
np.testing.assert_equal(nanunique(x, return_counts=True)[1], expected)

0 commit comments

Comments
 (0)