【问题标题】:Converting a list into numpy array of specific dimension将列表转换为特定维度的numpy数组
【发布时间】:2017-06-12 20:14:22
【问题描述】:

我正在研究多项式训练测试拟合问题,并希望将列表对象转换为 (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) 中删除了“.reshape(4, 100)”部分。数组函数,输出的维度变为 (4, 100, 1)。 (我为我的无知道歉,1 in (4, 100, 1) 代表什么?)

我想我的列表理解有问题,我目前无法弄清楚。谁能帮我指出我的代码错误或就如何将输出数组转换/重塑为所需的 (4, 100) 格式提出建议?

谢谢。

【问题讨论】:

  • 重塑不适合你吗?
  • 您了解np.newaxis 在索引表达式中的作用吗?
  • 让我们明确一点;是results.shape (100,4) 还是 (4,100,1)?
  • 感谢您的回复。 1.重塑似乎不起作用。 2. 据我了解,“np.newaxis”将结果选择的维度扩展了一个单位长度维度(我应该删除它吗?)
  • 'np.array(results).shape' 为 (4, 100, 1),'np.array(results).reshape(4, 100)' 为 (4, 100),但它似乎仍然保留了 1 个额外的维度(即,一个额外的 [])。

标签: python arrays list numpy


【解决方案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)

我对@9​​87654328@ 代码了解得不够多,无法知道您是否真的需要pred_data[:,np.newaxis]。我在其他 sklearn 问题中看到过类似 (#samples, #features) 的形状。因此,如果您有 100 个样本和 1 个特征,则像 (100,1) 这样的形状可能是正确的。

【讨论】:

  • 非常感谢您花时间解释这一切。我尝试了 .reshape(-1,1) 和 [:,np.newaxis] 方法,发现虽然它们的内部机制完全不同(根据文档),但它们都强制原始数据转换为一个列 (,1),以便可以将它们适合那些机器学习功能。另外,感谢您指出“np.squeeze()”技巧,我以前从来不知道!
猜你喜欢
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 2011-12-04
  • 2018-02-26
  • 2014-11-14
  • 2018-04-24
  • 1970-01-01
相关资源
最近更新 更多