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

时间:2014-12-17 01:16:30

标签: python list 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来说它真的很慢

您对最有效的方式有什么建议?

3 个答案:

答案 0 :(得分:70)

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

numpy.concatenate( LIST, axis=0 )

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

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

numpy.stack( LIST, axis=0 )

这采用了补充方法:它创建了每个输入数组的新视图并添加了一个额外的维度(在本例中,在左侧,因此每个n - 元素1D数组变为1-by-{ {1}} 2D数组)连接之前。只有当所有输入数组具有相同的形状时,它才会起作用 - 甚至沿着连接轴。

n(或等效vstack)通常是一种更易于使用的解决方案,因为它将采用一维1-维或/或二维数组,并在必要时自动扩展维度只有在必要时,才能将整个列表连接在一起。如果需要新维度,则会在左侧添加。同样,您可以一次连接整个列表而无需迭代:

row_stack

语法快捷方式numpy.vstack( LIST ) 也表现出这种灵活的行为(注意方括号)。这对于连接一些显式命名的数组很有用,但对你的情况不利,因为这种语法不会接受一系列数组,比如你的numpy.r_[ array1, ...., arrayN ]

还有一个类似的函数LIST和快捷column_stack,用于水平(逐列)堆叠,以及几乎 -analogous函数{{1} - 由于某种原因,后者的灵活性较低(输入数组和维度更严格,并尝试端到端连接1-D数组而不是将它们视为列)。

最后,在垂直堆叠1-D阵列的特定情况下,以下也适用:

c_[...]

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

答案 1 :(得分:3)

从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

享受,

答案 2 :(得分:2)

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

时间:

|------------|----------------|-------------------|
|            | 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) 并且如果我们使用比np.stacknp.array多的2d数组,则创建附加维-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}')