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

新手上路,请多包涵

假设我有;

 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 来说它真的很慢

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

原文由 erogol 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 320
2 个回答

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

 numpy.concatenate( LIST, axis=0 )

但是您 确实 需要担心列表中每个数组的形状和维数(对于 2 维 3x5 输出,您需要确保它们已经都是 2 维 n×5 数组)。如果要将一维数组串联为二维输出的行,则需要扩展它们的维度。

正如 Jorge 的回答所指出的,numpy 1.10 中还引入了函数 stack

 numpy.stack( LIST, axis=0 )

这采用了互补的方法:它创建了每个输入数组的新视图并添加了一个额外的维度(在本例中,在左侧,因此每个 n 元素 1D 数组变为 1 n by- --- 二维数组)在连接之前。它仅在所有输入数组具有相同形状时才有效。

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

 numpy.vstack( LIST )

语法快捷方式 numpy.r_[ array1, ...., arrayN ] (注意方括号)也展示了这种灵活的行为。这对于连接一些明确命名的数组很有用,但对您的情况不利,因为此语法不接受数组序列,例如 LIST

还有一个类似的函数 column_stack 和快捷方式 c_[...] ,用于水平(按列)堆叠,以及一个 几乎 类似的函数 hstack -though5for-thoughf549559出于某种原因,后者不太灵活(它对输入数组的维数更严格,并尝试端到端连接一维数组而不是将它们视为列)。

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

 numpy.array( LIST )

…因为数组可以由一系列其他数组构成,在开头添加一个新的维度。

原文由 jez 发布,翻译遵循 CC BY-SA 4.0 许可协议

从 NumPy 1.10 版开始,我们有了方法 stack 。它可以堆叠任何维度的数组(都相等):

 # List of arrays.
L = [np.random.randn(5,4,2,5,1,2) for i in range(10)]

# Stack them using axis=0.
M = np.stack(L)
M.shape # == (10,5,4,2,5,1,2)
np.all(M == L) # == True

M = np.stack(L, axis=1)
M.shape # == (5,10,4,2,5,1,2)
np.all(M == L) # == False (Don't Panic)

# This are all true
np.all(M[:,0,:] == L[0]) # == True
all(np.all(M[:,i,:] == L[i]) for i in range(10)) # == True

享受,

原文由 Jorge E. Cardona 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题