从列表创建 numpy 数组会产生错误的形状

tao*_*oat 5 python numpy machine-learning

我正在从 numpy 数组列表中创建几个 numpy 数组,如下所示:

seq_length = 1500
seq_diff = 200  # difference between start of two sequences
# x and y are 2D numpy arrays
x_seqs = [x[i:i+seq_length,:] for i in range(0, seq_diff*(len(x) // seq_diff), seq_diff)]
y_seqs = [y[i:i+seq_length,:] for i in range(0, seq_diff*(len(y) // seq_diff), seq_diff)]
boundary1 = int(0.7 * len(x_seqs))   # 70% is training set
boundary2 = int(0.85 * len(x_seqs))  # 15% validation, 15% test
x_train = np.array(x_seqs[:boundary1])
y_train = np.array(y_seqs[:boundary1])
x_valid = np.array(x_seqs[boundary1:boundary2])
y_valid = np.array(y_seqs[boundary1:boundary2])
x_test = np.array(x_seqs[boundary2:])
y_test = np.array(y_seqs[boundary2:])
Run Code Online (Sandbox Code Playgroud)

我想最终得到 6 个形状为 (n, 1500, 300) 的数组,其中 n 分别是训练、验证和测试数组数据的 70%、15% 或 15%。

这就是出错的地方:_trainand_valid数组结果很好,但_test数组是一维数组数组。那是:

  • x_train.shape 是 (459, 1500, 300)
  • x_valid.shape 是 (99, 1500, 300)
  • x_test.shape 是 (99,)

但是打印x_test验证它包含正确的元素——即它是一个 99 元素长的数组(1500, 300)数组。

为什么_test矩阵会得到错误的形状,而_train和_valid矩阵却不会?

hpa*_*ulj 4

项目的x_seqs长度各不相同。当它们的长度都相同时,np.array可以用它们制作一个 3d 数组;当它们不同时,它会生成一个列表的对象数组。看看dtype的x_test. 看着那(这[len(i) for i in x_test]。

我拿了你的代码,补充道:

x=np.zeros((2000,10))
y=x.copy()
...
print([len(i) for i in x_seqs])
print(x_train.shape)
print(x_valid.shape)
print(x_test.shape)
Run Code Online (Sandbox Code Playgroud)

并得到:

1520:~/mypy$ python3 stack40643639.py 
[1500, 1500, 1500, 1400, 1200, 1000, 800, 600, 400, 200]
(7,)
(1, 600, 10)
(2,)
Run Code Online (Sandbox Code Playgroud)