Python: 正确重塑数组
Python: reshape array correctly
我有以下功能
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 作为
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).
我有以下功能
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 作为 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).