将2维数组附加到单个数组

时间:2015-01-13 14:49:10

标签: python arrays numpy

我有一个2维np.arrays()的循环,我需要将这些数组添加到一个单独的数组中。

在普通Python中我会这样做

In [37]: a1 = [[1,2],[3,4]]

In [38]: b1 = [[5,6],[7,8]]

In [39]: l1 = []

In [40]: l1.append(a1)

In [41]: l1.append(b1)

In [42]: l1
Out[42]: [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]

如何使用numpy为l1获得相同的结果?

3 个答案:

答案 0 :(得分:4)

只需使用:

l1 = np.array([a1,b1])

另请注意,在numpy中,您不会附加到数组。您先分配它们,然后填写它们:

import numpy as np
a1 = np.array([[1,2],[3,4]])
b1 = np.array([[5,6],[7,8]])
#allocate exact size of the final array
l1 = empty(((2,)+a1.shape),dtype=a1.dtype)
l1[0]=a1
l1[1]=b1

或者您使用众多帮助函数中的一个(dstackhstackconcatenate由其他人描述)

编辑:我发现上述两个解决方案都非常易读且接近python列表语法,但这是相当主观的。根据连接的不同,你会发现这两种解决方案对于@unutbu提出的最快解决方案的速度要快一些。另外请注意,这不会创建视图。

答案 1 :(得分:3)

以下是从数组中产生输出的一种方法:

>>> np.dstack((a1,b1)).transpose(2,0,1)

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

       [[ 5,  6],
        [ 7,  8]],

np.dstack生成一个3D数组,但轴需要以不同的顺序读取。我们希望轴(0, 1, 2)的顺序更改为(2, 0, 1),因此需要转置和交换轴。


以下是有用的 - 但不是直接相关的 - 有关连接数组的信息。 (在指出我对问题的误解之前输入。)

连接数组的一种方法是使用np.concatenate

>>> np.concatenate((a1, b1))
array([[1, 2],
       [3, 4],
       [5, 6],
       [7, 8]])

这一个堆叠在另一个之下。您还可以将数组与np.concatenate((a1, b1), axis=1)并排连接。 (可以将两个以上的数组传递给函数。)

还有其他功能可以做到这一点;上述两项操作可分别使用np.vstack((a1,b1))np.hstack((a1,b1))完成。

如果要加入3D数组中的数组,可以使用np.dstack((a1,b1))

array([[[1, 5],
        [2, 6]],

       [[3, 7],
        [4, 8]]])

请记住,与Python列表不同,Numpy数组无法动态增长内存。这些操作会导致数组被复制,并且新的内存块将被更大的数组填充。如果数组很大,这可能效率低下。

答案 2 :(得分:3)

a1 = np.array([[1,2],[3,4]])
b1 = np.array([[5,6],[7,8]])
l1 = np.r_['0,3', a1, b1]

产量

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

       [[5, 6],
        [7, 8]]])

特殊指令'0,3'告诉np.r_沿axis=0连接,并生成至少3维的结果。


或者,使用concatenatereshape更具可读性和更快性:

l1 = np.concatenate([a1, b1]).reshape((2,)+a1.shape))

In [111]: a2 = np.tile(a1, (10000,1))

In [112]: b2 = np.tile(b1, (10000,1))

In [113]: %timeit np.r_['0,3', a2, b2].shape
10000 loops, best of 3: 62.4 µs per loop

In [114]: %timeit np.concatenate([a2, b2]).reshape((2,)+a2.shape)
10000 loops, best of 3: 39.8 µs per loop