【问题标题】:ValueError: all input arrays must have the same shapeValueError:所有输入数组必须具有相同的形状
【发布时间】:2018-06-21 17:00:27
【问题描述】:

我正在尝试执行代码但收到此值错误。 Source.pkl 文件包含 100 个元素,如随附的 array.png 所示。

如图所示,索引 0 处有 16 个 numpy 数组,它们的形状都为 (1,59),因此,第一个元素的形状为 (16,1,59)。在索引 1 处,有 11 个 numpy 数组都具有 shape(1,59) 所以,现在第二个元素的形状是 (11,1,59),其他元素也是如此。

我怎样才能让所有的数组都具有相同的形状?

import numpy as np
from keras.layers import Input, LSTM, Dense
from keras.models import Model

pickle_in = open("source.pkl","rb")
predictions = np.load(pickle_in)[0:100]
in_predictions = np.stack(predictions)
pickle_in.close()

【问题讨论】:

    标签: arrays python-3.x numpy


    【解决方案1】:

    这里有两个选择:

    向每个列表添加零个数组,直到所有列表的大小相同。在您的情况下,假设 16 是所有列表中最大的大小,您必须将 (1, 59) 形状的数组附加到每个列表,直到它的大小为 16。

    但是,这是浪费空间。另一种选择是:

    将您的列表连接到一个大列表,然后将大列表转换为 numpy 数组。使用另一个列表来记录哪个数组最初在哪个列表中。 这是一个示例代码,但我没有测试过:

    pickle_in = open("source.pkl","rb")
    predictions = np.load(pickle_in)[0:100]
    wrap_list = []
    index_map = []
    for i in range(len(predictions)):
        pred = predictions[i]
        wrap_list += pred
        index_map += [i for _ in range(len(pred))]
    in_predictions = np.array(wrap_list)
    pickle_in.close()
    

    希望对你有帮助。

    【讨论】:

    • 可以,但是有没有办法连接第一个数组的元素,以便形状在索引 0 处变为 (16, 59),在索引 1 处变为 (11, 59) 等等?然后我可以执行零填充以使它们具有相同的形状。提前致谢。
    • 当然。只需使用np.concatenate(x, y),例如,如果x.shape=(1, 59)y.shape=(1,59)z = np.concatenate(x,y),则z.shape=(2,59)
    猜你喜欢
    • 2019-03-22
    • 2016-12-15
    • 1970-01-01
    • 2019-09-22
    • 2018-06-12
    • 2017-06-18
    • 2018-05-18
    • 2018-06-23
    • 2017-07-13
    相关资源
    最近更新 更多