应该有办法改变这样的列表:
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
循环很慢,听起来不像是电视购物节目,但必须有更好的方法!
答案 0 :(得分:6)
一种方法是使用column_stack
:
>>> np.column_stack((a, b))
array([[ 1, 6],
[ 2, 7],
[ 3, 8],
[ 4, 9],
[ 5, 10]])
column_stack
首先强制列表到数组并返回一个数组。
由于a
和b
都是单个元素列表的列表,因此在强制转换为数组时,每个元素都会成为2D列向量。由于这个事实,您也可以使用hstack
或concatenate
来实现相同的功能(它们也会将列表强制转换为具有我们想要的正确形状的数组)。使用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]]
hstack
和column_stack
也加入1
轴,根据需要调整维度。但我喜欢np.concatenate
给出(和要求)的明确控制。