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

Python 如何使用NumPy从列表创建多维数组?,python,arrays,list,numpy,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]] 对这样的事情: a = [[1], [2], [3], [4], [5]] b = [[6], [7], [8], [9], [10]] c = [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]] 现在我正在使

应该有一种方法可以像这样打开列表:

a = [[1], [2], [3], [4], [5]]
b = [[6], [7], [8], [9], [10]]
c = [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]
对这样的事情:

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的循环速度很慢,听起来不像是一个信息广告,但必须有更好的方法

一种方法是使用:

column\u stack
首先将列表强制为数组并返回数组

由于
a
b
都是单个元素的列表,因此当强制为数组时,每个元素都成为二维列向量。由于这一事实,您还可以使用或实现相同的功能(它们还强制列表为具有正确形状的数组)。使用
np.hstack((a,b))
np.concatenate((a,b),axis=1)


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

非numpy解决方案是可行的

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]])
因为
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]]
hstack
column\u stack
也在
1
轴上连接,必要时调整尺寸。但是我喜欢
np.concatenate
提供(和要求)的显式控制