将列表转换为特定维度的numpy数组

时间:2017-06-12 20:14:23

标签: python arrays list numpy

我正在研究多项式列车测试拟合问题,并希望将列表对象转换为形式(4,100)的numpy数组。 (即4行,100列) 我有以下代码:

from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from numpy import array
np.random.seed(0)
n = 15
x = np.linspace(0,10,n) + np.random.randn(n)/5
y = np.sin(x)+x/6 + np.random.randn(n)/10

X_train, X_test, y_train, y_test = train_test_split(x, y, random_state=0)
results = []
pred_data = np.linspace(0,10,100)
degree = [1,3,6,9]
y_train1 = y_train.reshape(-1,1)
        
for i in degree:
    poly = PolynomialFeatures(degree=i)
    pred_poly1 = poly.fit_transform(pred_data[:,np.newaxis])
    X_F1_poly = poly.fit_transform(X_train[:,np.newaxis])
        linreg = LinearRegression().fit(X_F1_poly, y_train1)
    pred = linreg.predict(pred_poly1)
    results.append(pred)
    
dataArray = np.array(results).reshape(4, 100)
 
    return dataArray

代码工作正常并返回一个(4,100)数组,但输出看起来像100行和4列,一旦我从np中删除了“.reshape(4,100)”部分。数组函数,输出的维数变为(4,100,1)。 (我为我的无知道歉,(4,100,1)中的1代表什么?)

我想我的列表理解有些问题,我现在无法理解。任何人都可以帮我指出我的代码错误或建议如何将输出数组转换/重塑为所需的(4,100)格式?

谢谢。

1 个答案:

答案 0 :(得分:1)

让我们运行您的代码的简化版本,省略sklearn polyfit正在做的事情的细节:

In [248]: results = []
     ...: pred_data = np.linspace(0,10,100)
     ...: degree = [1,3,6,9]
     ...: 
In [249]: for i in degree:
     ...:     results.append(pred_data[:,np.newaxis])
     ...:     
In [250]: len(results)
Out[250]: 4
In [251]: results[0].shape
Out[251]: (100, 1)
In [252]: arr = np.array(results)
In [253]: arr.shape
Out[253]: (4, 100, 1)

pred_data是(100,)(通过线空间构造)。 newaxis成功(100,1)。用它做一些事情,并收集结果4x,结果是4(100,1)数组的列表。将它们连接成一个数组,我们得到一个3d(4,100,1)数组。

arr的显示开头为:

array([[[  0.        ],
        [  0.1010101 ],
        [  0.2020202 ],
        ...
        [  9.7979798 ],
        [  9.8989899 ],
        [ 10.        ]]])

内部元素[...],与最后一个尺寸1维一致。

我可以通过各种方式删除最后一个维度

arr.reshape(4,100)
arr[:,:,0]
np.squeeze(arr)

我不太了解sklearn代码,知道您是否真的需要pred_data[:,np.newaxis]。我在其他sklearn问题中看到了像(#samples,#feature)这样的形状。因此,如果您有100个样本和1个特征,那么像(100,1)这样的形状可能是正确的。