预期的2D阵列,取而代之的是1D阵列

时间:2018-07-11 01:56:54

标签: python pandas numpy scikit-learn

from sklearn import MinMaxScaler, StandardScaler
import numpy as np

a = ([1,2,3],[4,5,6])
stan = StandardScaler()
mima = MinMaxScaler()
stan.fit_tranform(a)
mima.fit_transform(a)

results after runnin stan and mima

array([[-1., -1., -1.],
   [ 1.,  1.,  1.]])

array([[0., 0., 0.],
   [1., 1., 1.]])

但是,当我尝试传递这样的一维数组时,

b = np.random.random(10)
stan.fit_tranform(b)
mima.fit_transform(b)

我遇到这样的错误

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/anaconda3/lib/python3.6/site-packages/sklearn/base.py", line 517, in  fit_transform
return self.fit(X, **fit_params).transform(X)
File "/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/data.py",  line 308, in fit
return self.partial_fit(X, y) 
File "/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/data.py", line 334, in partial_fit
estimator=self, dtype=FLOAT_DTYPES)
File "/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py", line 441, in check_array
"if it contains a single sample.".format(array))
ValueError: Expected 2D array, got 1D array instead:
array=[0.05808361 0.86617615 0.60111501 0.70807258 0.02058449 0.96990985
0.83244264 0.21233911 0.18182497 0.18340451].
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.

GitHub上也有一个线程,但是很久以前就关闭了。有什么办法可以解决这个问题。

1 个答案:

答案 0 :(得分:4)

首先尝试了解MinMaxScalar和StandardScalar的功能。它们基于各个列对数据值进行标准化(或缩放)。因此,如果您的数据有3列:-

1)MinMaxScalar将分别从每个列中找到最大值和最小值,并根据那些最小值和最大值缩放该列的其他值。所有列均相同。 2)StandardScalar将类似地分别找到每列的均值和标准差,然后进行缩放。

然后,在the explanation中查看我的答案,为什么它不接受一维数组。

现在,您正在这些标量中传递一维数组。他们将如何知道要扩展什么。有几列?您是否希望将所有10个值都作为一个单独的列,还是要将所有10个值都视为10个列,将彼此分开处理。无论哪种情况,您都必须相应地重塑数据,而scikit将无法处理。

1)如果您希望它们成为一列,请像这样重塑:

# Here first value -1 is for rows and second 1 for column
# This means you want the columns to be 1 and -1 
# will be configured automatically (10 in this case)
b = b.reshape(-1, 1) 

2)如果要将这10个值设置为10列的单行,请执行以下操作:

b = b.reshape(1, -1) 

然后您可以执行以下操作:

stan.fit_tranform(b)

但是请注意,每种情况下的结果都会有所不同。