我有一个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获得相同的结果?
答案 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
或者您使用众多帮助函数中的一个(dstack
,hstack
,concatenate
由其他人描述)
答案 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维的结果。
或者,使用concatenate
和reshape
更具可读性和更快性:
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