如何将numpy数组列表转换为单个numpy数组?

发布于 2021-01-29 18:41:45

假设我有;

LIST = [[array([1, 2, 3, 4, 5]), array([1, 2, 3, 4, 5],[1,2,3,4,5])] # inner lists are numpy arrays

我尝试转换;

array([[1, 2, 3, 4, 5],
       [1, 2, 3, 4, 5],
       [1, 2, 3, 4, 5])

我现在正在vstack上通过迭代来解决它,但是对于特别大的LIST来说确实很慢

您对最佳有效方法有何建议?

关注者
0
被浏览
160
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    通常,您可以沿任意轴连接整个数组序列:

    numpy.concatenate( LIST, axis=0 )
    

    但你
    必须对列表中的形状和每个阵列的维度担心(用于2维3x5的输出,你需要确保它们都是2维正由-5阵列的话)。如果要将一维数组连接为二维输出的行,则需要扩展其维数。

    正如Jorge的答案所指出的那样,stack在numpy 1.10中引入了function :

    numpy.stack( LIST, axis=0 )
    

    这采用了补充方法:在连接之前,它会为每个输入数组创建一个新视图并添加一个额外的维数(在这种情况下为左侧,因此每个n元素1D数组都将变为1 x
    n2D数组)。仅当所有输入数组都具有相同的形状时才有效(即使沿串联轴也是如此)。

    vstack(或等价的row_stack)通常是一个更易于使用的解决方案,因为它将采用一维和/或二维数组序列,并在将整个列表连接在一起之前,在必要时且仅在必要时自动扩展维数。在需要新尺寸的地方,将其添加到左侧。同样,您可以一次串联整个列表,而无需进行迭代:

    numpy.vstack( LIST )
    

    语法快捷方式numpy.r_[ array1, ...., arrayN ](请注意方括号)也表现出这种灵活的行为。这对于连接几个显式命名的数组很有用,但对您的情况不利,因为此语法将不接受数组序列,例如your LIST

    对于水平(列)堆栈,还有一个类似的函数column_stack和快捷方式c_[...],以及一个 几乎
    类似的函数,hstack尽管出于某种原因,后者的灵活性较差(它对输入数组的维数更为严格,并试图进行串联)一维数组首尾相连,而不是将其视为列)。

    最后,在垂直堆叠一维数组的特定情况下,以下内容也适用:

    numpy.array( LIST )
    

    …因为数组可以从其他数组序列中构造出来,因此在开头增加了新的维度。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看