diff --git a/Orange/statistics/util.py b/Orange/statistics/util.py index 57c38bbdc9e..7dc56490146 100644 --- a/Orange/statistics/util.py +++ b/Orange/statistics/util.py @@ -361,7 +361,9 @@ def weighted_mean(): X.shape[0] - non_zero, non_zero)) else: - nans = (~X.astype(bool)).sum(axis=0) if X.size else np.zeros(X.shape[1]) + X_str = X.astype(str) + nans = ((X_str == "nan") | (X_str == "")).sum(axis=0) \ + if X.size else np.zeros(X.shape[1]) return np.column_stack(( np.tile(np.inf, X.shape[1]), np.tile(-np.inf, X.shape[1]), diff --git a/Orange/tests/test_statistics.py b/Orange/tests/test_statistics.py index 59a04e9e29c..1c0b4226ccd 100644 --- a/Orange/tests/test_statistics.py +++ b/Orange/tests/test_statistics.py @@ -118,13 +118,14 @@ def test_stats_weights_sparse(self): def test_stats_non_numeric(self): X = np.array([ - ['', 'a', 'b'], - ['a', '', 'b'], - ['a', 'b', ''], + ["", "a", np.nan, 0], + ["a", "", np.nan, 1], + ["a", "b", 0, 0], ], dtype=object) np.testing.assert_equal(stats(X), [[np.inf, -np.inf, 0, 0, 1, 2], [np.inf, -np.inf, 0, 0, 1, 2], - [np.inf, -np.inf, 0, 0, 1, 2]]) + [np.inf, -np.inf, 0, 0, 2, 1], + [np.inf, -np.inf, 0, 0, 0, 3]]) def test_nanmin_nanmax(self): warnings.filterwarnings("ignore", r".*All-NaN slice encountered.*")