【问题标题】:Python: reshape array correctlyPython:正确重塑数组
【发布时间】:2021-12-31 13:43:13
【问题描述】:

我有以下功能

import math
import pandas as pd
import pandas_datareader as web
import numpy as np    
import matplotlib.pyplot as plt
import os.path

from sklearn.preprocessing import MinMaxScaler

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM, Dropout
from tensorflow.keras.models import load_model

def predict_stock(stock_name, predict_days=30):
    start = dt.datetime(2021, 1, 1)
    end = dt.datetime.now()

    stock = web.DataReader(stock_name, data_source="yahoo", start=start, end=end)
    stock = stock.filter(["Adj Close"])
    stock_data = stock.values

    # splits the stock into training data and test data
    training_len = math.ceil(len(stock) - predict_days)

    scale = MinMaxScaler()
    scaled_data = scale.fit_transform(stock_data)
    train_data = scaled_data[:training_len]

    # sets train values
    x_train = []
    y_train = []

    # test starts at day 60 and ends at 80 % of day end (test data)
    for i in range(predict_days, len(train_data)):
        x_train.append(train_data[i - predict_days:i])
        y_train.append(train_data[i:i+predict_days])
    x_train = np.array(x_train)
    y_train = np.array(y_train)
    #y_train.reshape(y_train, x_train.shape)

predict_stock('ALB', 30)

虽然 x_train 的形状为 (164, 30, 1),但 y_train 由于某种原因形状为 (164,),因此生成是相同的。

如何将 y_train 重塑为 (164,30,1)?

我试过命令:

 y_train.reshape(y_train, x_train.shape)

但这给了我错误:

TypeError: only integer scalar arrays can be converted to a scalar index

如何正确重塑数组?

【问题讨论】:

  • 你的 y_train 是 (164) 它只包含标签是完全正常的,你的训练 x_train 包含 30 个特征和 164 行的特征。
  • 你为什么使用 x_train 作为参数?
  • 我的目标是让 y_train 的形状与 x_train 相同
  • 好的,这就是 x_train..shape 参数的用途。但是为什么是整个x_train?您是否查看了reshape 文档以了解它期望的参数类型?在跑到网上寻求帮助之前检查文档!
  • 在重新格式化问题时,我意识到您无法重塑 y_train 以匹配 x_train。您可以将其重塑为(164,1),但您不能增加元素总数以匹配x_train。但是如果x_train 有 164 个“样本”和 30 个“特征”,y_train 就不应该有 30 个维度。每个样本只有一个值。

标签: python arrays numpy reshape


【解决方案1】:

您的代码中最基本的缺陷是您将 y_train 传递为 reshape的第一个参数(y_train数组的方法)。

但发现这一点还不够。

如果你想把 y_train 改造成 x_train 的形状, 那么 y_train 必须与 x_train 具有 相同数量 的元素。 你可以实现它调用例如np.repeat

np.repeat(y_train, x_train.shape[1])

即“多次”出现源元素,但到目前为止的结果 仍然是一个 1D 数组。

第二步是重塑。

所以整个代码可以是:

result = np.repeat(y_train, x_train.shape[1]).reshape(x_train.shape)

我故意将结果保存在另一个数组中,以保持 任何比较的源数​​组。

但也可以考虑另一种方法,可能更好地匹配 计算机学习方法:

我想将 y_train 转换为 单列 形状就足够了。 所以试试:

result2 = np.expand_dims(y_train, 1)

这次结果的形状是(164, 1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多