Skip to content

Commit 11eee67

Browse files
Statistics.nanunique: Pass all parameters to unique function call
1 parent 712d88a commit 11eee67

File tree

2 files changed

+27
-10
lines changed

2 files changed

+27
-10
lines changed

Orange/statistics/util.py

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

443443

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

450456

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

Orange/tests/test_statistics.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,13 +115,6 @@ def test_nanmin_nanmax(self):
115115
nanmax(X_sparse, axis=axis),
116116
np.nanmax(X, axis=axis))
117117

118-
def test_nanunique(self):
119-
x = csr_matrix(np.array([0, 1, 1, np.nan]))
120-
np.testing.assert_array_equal(
121-
nanunique(x),
122-
np.array([0, 1])
123-
)
124-
125118
def test_mean(self):
126119
for X in self.data:
127120
X_sparse = csr_matrix(X)
@@ -400,3 +393,21 @@ def test_sparse_explicit_zeros(self):
400393
unique(y, return_counts=True),
401394
unique(x, return_counts=True),
402395
)
396+
397+
@dense_sparse
398+
def test_nanunique_ignores_nans_in_values(self, array):
399+
x = array([[-1., 1., 0., 2., 3., np.nan],
400+
[ 0., 0., 0., 3., 5., np.nan],
401+
[-1., 0., 0., 1., 7., 6.]])
402+
expected = [-1, 0, 1, 2, 3, 5, 6, 7]
403+
404+
np.testing.assert_equal(nanunique(x, return_counts=False), expected)
405+
406+
@dense_sparse
407+
def test_nanunique_ignores_nans_in_counts(self, array):
408+
x = array([[-1., 1., 0., 2., 3., np.nan],
409+
[ 0., 0., 0., 3., 5., np.nan],
410+
[-1., 0., 0., 1., 7., 6.]])
411+
expected = [2, 6, 2, 1, 2, 1, 1, 1]
412+
413+
np.testing.assert_equal(nanunique(x, return_counts=True)[1], expected)

0 commit comments

Comments
 (0)