如何使用NumPy从列表创建多维数组?

时间:2015-12-27 19:05:33

标签: python arrays list numpy

应该有办法改变这样的列表:

a = [[1], [2], [3], [4], [5]]
b = [[6], [7], [8], [9], [10]]

这样的事情:

c = [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]

现在我正在使用for循环完成此操作。

c = []
for pos in range(len(a)):
    c.append([a[pos], b[pos]])

无论如何for循环很慢,听起来不像是电视购物节目,但必须有更好的方法!

2 个答案:

答案 0 :(得分:6)

一种方法是使用column_stack

>>> np.column_stack((a, b))
array([[ 1,  6],
       [ 2,  7],
       [ 3,  8],
       [ 4,  9],
       [ 5, 10]])

column_stack首先强制列表到数组并返回一个数组。

由于ab都是单个元素列表的列表,因此在强制转换为数组时,每个元素都会成为2D列向量。由于这个事实,您也可以使用hstackconcatenate来实现相同的功能(它们也会将列表强制转换为具有我们想要的正确形状的数组)。使用np.hstack((a, b))np.concatenate((a, b), axis=1)

为了完整起见,还可以通过编写np.c_[a, b]来使用np.c_。其他方法更直接,但可能更快。

答案 1 :(得分:2)

非笨拙的解决方案

In [10]: zip(a,b)
Out[10]: [([1], [6]), ([2], [7]), ([3], [8]), ([4], [9]), ([5], [10])]

哎呀 - 不太好。如果没有内部括号,zip可以很好地重新组合列表:

In [11]: zip([1,2,3],[4,5,6])
Out[11]: [(1, 4), (2, 5), (3, 6)]

多玩一点,我得到了

In [12]: zip(zip(*a)[0],zip(*b)[0])
Out[12]: [(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]

我也是列表理解的忠实粉丝。它们是循环的一种形式,但是使用普通的Python尽可能快。我也需要[0]从内部列表中提取术语。

In [25]: [[i[0],j[0]] for i,j in zip(a,b)]
Out[25]: [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]

itertools.chain是另一个展平嵌套列表的好工具:

In [31]: zip(*(itertools.chain(*a),itertools.chain(*b)))
Out[31]: [(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]

但是既然你提到了numpy我们可以使用:

In [18]: np.concatenate((a,b),axis=1)
Out[18]: 
array([[ 1,  6],
       [ 2,  7],
       [ 3,  8],
       [ 4,  9],
       [ 5, 10]])

基本concatenate有效,因为np.array(a)会产生(5,1)数组。因此,可以将2个这样的数组连接到(5,2)数组中,而无需进行任何进一步的形状调整。

要返回嵌套列表格式,请在该阵列上使用tolist

In [19]: np.concatenate((a,b),axis=1).tolist()
Out[19]: [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]

hstackcolumn_stack也加入1轴,根据需要调整维度。但我喜欢np.concatenate给出(和要求)的明确控制。