diff --git a/sklearn/preprocessing/tests/test_data.py b/sklearn/preprocessing/tests/test_data.py index fb912531265ff1aed894dbd77a2fc5aeba9e1f67..e777fb5ffe98bfabd07e71bc7cdafc25beae2f07 100644 --- a/sklearn/preprocessing/tests/test_data.py +++ b/sklearn/preprocessing/tests/test_data.py @@ -13,6 +13,7 @@ from distutils.version import LooseVersion from sklearn.utils import gen_batches +from sklearn.utils.testing import assert_raise_message from sklearn.utils.testing import assert_almost_equal from sklearn.utils.testing import clean_warning_registry from sklearn.utils.testing import assert_array_almost_equal @@ -932,6 +933,10 @@ def test_quantile_transform_check_error(): assert_raises_regex(ValueError, "'output_distribution' has to be either" " 'normal' or 'uniform'. Got 'rnd' instead.", transformer.inverse_transform, X_tran) + # check that an error is raised if input is scalar + assert_raise_message(ValueError, + 'Expected 2D array, got scalar array instead', + transformer.transform, 10) def test_quantile_transform_sparse_ignore_zeros(): @@ -1157,14 +1162,16 @@ def test_quantile_transform_bounds(): X = np.random.random((1000, 1)) transformer = QuantileTransformer() transformer.fit(X) - assert_equal(transformer.transform(-10), transformer.transform(np.min(X))) - assert_equal(transformer.transform(10), transformer.transform(np.max(X))) - assert_equal(transformer.inverse_transform(-10), + assert_equal(transformer.transform([[-10]]), + transformer.transform([[np.min(X)]])) + assert_equal(transformer.transform([[10]]), + transformer.transform([[np.max(X)]])) + assert_equal(transformer.inverse_transform([[-10]]), transformer.inverse_transform( - np.min(transformer.references_))) - assert_equal(transformer.inverse_transform(10), + [[np.min(transformer.references_)]])) + assert_equal(transformer.inverse_transform([[10]]), transformer.inverse_transform( - np.max(transformer.references_))) + [[np.max(transformer.references_)]])) def test_quantile_transform_and_inverse(): diff --git a/sklearn/utils/tests/test_validation.py b/sklearn/utils/tests/test_validation.py index 37a0eb859f56503336592a473e754d029f1b5aaa..9e02c4c5610ab90565b45cf5d12a0a85b3518d46 100644 --- a/sklearn/utils/tests/test_validation.py +++ b/sklearn/utils/tests/test_validation.py @@ -142,9 +142,13 @@ def test_check_array(): # ensure_2d=False X_array = check_array([0, 1, 2], ensure_2d=False) assert_equal(X_array.ndim, 1) - # ensure_2d=True + # ensure_2d=True with 1d array assert_raise_message(ValueError, 'Expected 2D array, got 1D array instead', check_array, [0, 1, 2], ensure_2d=True) + # ensure_2d=True with scalar array + assert_raise_message(ValueError, + 'Expected 2D array, got scalar array instead', + check_array, 10, ensure_2d=True) # don't allow ndim > 3 X_ndim = np.arange(8).reshape(2, 2, 2) assert_raises(ValueError, check_array, X_ndim) diff --git a/sklearn/utils/validation.py b/sklearn/utils/validation.py index 080c30fcf9b2c02d2283216c94c177b30a867111..b3538a79258920a8c1ffc85333f5aa1e2b349849 100644 --- a/sklearn/utils/validation.py +++ b/sklearn/utils/validation.py @@ -459,13 +459,20 @@ def check_array(array, accept_sparse=False, dtype="numeric", order=None, _ensure_no_complex_data(array) if ensure_2d: + # If input is scalar raise error + if array.ndim == 0: + raise ValueError( + "Expected 2D array, got scalar array instead:\narray={}.\n" + "Reshape your data either using array.reshape(-1, 1) if " + "your data has a single feature or array.reshape(1, -1) " + "if it contains a single sample.".format(array)) + # If input is 1D raise error if array.ndim == 1: raise ValueError( "Expected 2D array, got 1D array instead:\narray={}.\n" "Reshape your data either using array.reshape(-1, 1) if " "your data has a single feature or array.reshape(1, -1) " "if it contains a single sample.".format(array)) - array = np.atleast_2d(array) # To ensure that array flags are maintained array = np.array(array, dtype=dtype, order=order, copy=copy)