【问题标题】:Convert a list containing 10 elemnts into three dimentional array将包含 10 个元素的列表转换为 3 维数组
【发布时间】:2020-07-27 08:24:06
【问题描述】:

我有一个包含 10 个元素的列表,这些元素具有这些形状 [(1, 13),(2, 13),(2, 13),(13, 13),(4, 13),(5, 13),(5, 13),(6, 13),(2, 13),(8, 13)]。列表中的每个元素都是二维的,例如列表的第一个元素是 array([[0. , 0. , 0.33, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0.67, 0. , 0. ]])

我想用dimensions(10,?,13) 将此列表转换为三维数组,但问题是第二维不是一个固定的数字,它会因每种情况而改变。有没有办法做到这一点?

我必须将这个三维输入输入到我的 Keras 模型中。

【问题讨论】:

  • 如果它取决于形状,例如,您可以使用其键作为形状和第二维之间的元组映射来制作字典。此外,我想说这在很大程度上取决于您实现您称为代码的“案例”的难易程度。每种情况都取决于形状吗?是否可以仅使用形状作为输入来生成第二维(例如Dict[tuple, Callable] 类型的字典)?
  • 试着再澄清一下你对第二维度的需求,答案真的取决于它。如果您需要 3d 数组包含每个 2d 数组一次并留下一些空间,那么第 2 维只需要 13。如果您需要重复每个 2d 数组以填充 3d 数组而没有剩余空间,那么第 2 维尺寸必须为 1560。
  • 我的列表实际上是句子列表,列表中包含每个单词的一些值,因此每个单词都是 1x13。如果一个句子是 5 个单词,那么这将是 5x13 的形状。所以这一切都取决于每个句子中的单词数量并有所不同。

标签: python tensorflow multidimensional-array


【解决方案1】:

填充就是你所需要的

重新创建您的数据:

X = []
for _ in range(10):
    i = np.random.randint(15)
    x = np.random.uniform(0,1, (i,13))
    X.append(x)

使用填充:

max_dim = 20

X_pad = []
for x in X:
    X_pad.append(np.pad(x, ((max_dim-len(x),0),(0,0)), mode='constant')) # pre padding
    # X_pad.append(np.pad(x, ((0,max_dim-len(x)),(0,0)), mode='constant')) # post padding
    
X_pad = np.stack(X_pad)
X_pad.shape # (10, max_dim, 13)

【讨论】:

  • 第二维的最大长度为 107。因此,如果 x 的长度为 1,那么它将用 0 填充 106 个元素。是否需要填充并使其大小相同?
  • 正确。是的,有必要填充 ALL 并使 ALL 的大小相同。您需要设置 max_dim ,它 >= 比数组的最大 len 值。例如,如果 107 是最大长度,请将 max_dim 设置为 >= 107 的整数。不要忘记投票并接受它;-)
  • 以及我必须将此填充作为后填充而不是预填充?
  • 一般来说是'pre',但这不是一个关键的选择,你可以同时尝试。 (在我的编辑中,我进行了多样化)
猜你喜欢
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多