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


100

假设我有;

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来说确实很慢

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


5
LIST = [[array([1, 2, 3, 4, 5]), array([1, 2, 3, 4, 5],[1,2,3,4,5])]这是不正确的python语法。请澄清。
Marcin 2014年

Answers:


128

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

numpy.concatenate( LIST, axis=0 )

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

正如Jorge的答案所指出的那样,还有stacknumpy 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 )

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


5
我认为他想要2d数组作为输出。
Beefster '17

7

从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

请享用,


1

我检查了一些提高速度性能的方法,发现没有什么不同! 唯一的区别是,使用某些方法必须仔细检查尺寸。

定时:

|------------|----------------|-------------------|
|            | shape (10000)  |  shape (1,10000)  |
|------------|----------------|-------------------|
| np.concat  |    0.18280     |      0.17960      |
|------------|----------------|-------------------|
|  np.stack  |    0.21501     |      0.16465      |
|------------|----------------|-------------------|
| np.vstack  |    0.21501     |      0.17181      |
|------------|----------------|-------------------|
|  np.array  |    0.21656     |      0.16833      |
|------------|----------------|-------------------|

如您所见,我尝试了2个实验-使用np.random.rand(10000)np.random.rand(1, 10000) 如果我们使用2d数组,则np.stacknp.array创建附加维度-result.shape是(1,10000,10000)和(10000,1,10000),那么他们需要采取其他措施来避免这种情况。

码:

from time import perf_counter
from tqdm import tqdm_notebook
import numpy as np
l = []
for i in tqdm_notebook(range(10000)):
    new_np = np.random.rand(10000)
    l.append(new_np)



start = perf_counter()
stack = np.stack(l, axis=0 )
print(f'np.stack: {perf_counter() - start:.5f}')

start = perf_counter()
vstack = np.vstack(l)
print(f'np.vstack: {perf_counter() - start:.5f}')

start = perf_counter()
wrap = np.array(l)
print(f'np.array: {perf_counter() - start:.5f}')

start = perf_counter()
l = [el.reshape(1,-1) for el in l]
conc = np.concatenate(l, axis=0 )
print(f'np.concatenate: {perf_counter() - start:.5f}')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.