我的清单如下。
list=[[np.array([[-3., 3., 3.],
[-3., 3., 3.],
[-3., 3., 3.],
[ 1., 4., 2.],
[-0., 4., -5.],
[ 3., 6., -5.]])],
[np.array([[-1., 2., -3.],
[-1., 2., -3.],
[-1., 2., -3.],
[-2., 2., 1.],
[-0., 4., -0.],
])]]
该列表包含numpy数组。应该注意的是,每个numpy数组中的行数不同,但列数相同。如示例中所示,第一个数组中的行数为6,而第二个数组中的行数为5。 我的目标是从上面的列表中创建一个numpy矩阵或数组。
[-3., 3., 3.]
[-3., 3., 3.]
[-3., 3., 3.]
[ 1., 4., 2.]
[-0., 4., -5.]
[ 3., 6., -5.]
[-1., 2., -3.]
[-1., 2., -3.]
[-1., 2., -3.]
[-2., 2., 1.]
[-0., 4., -0.]
在python中是否有快速有效的方法?我有1000个需要转换的数组。
答案 0 :(得分:2)
您需要np.ravel
之前的列表np.vstack
:
与您的示例相同:
l =[[np.array([[-3., 3., 3.],
[-3., 3., 3.],
[-3., 3., 3.],
[ 1., 4., 2.],
[-0., 4., -5.],
[ 3., 6., -5.]])],
[np.array([[-1., 2., -3.],
[-1., 2., -3.],
[-1., 2., -3.],
[-2., 2., 1.],
[-0., 4., -0.],
])]]
np.vstack(np.ravel(l))
Out[119]:
array([[-3., 3., 3.],
[-3., 3., 3.],
[-3., 3., 3.],
[ 1., 4., 2.],
[-0., 4., -5.],
[ 3., 6., -5.],
[-1., 2., -3.],
[-1., 2., -3.],
[-1., 2., -3.],
[-2., 2., 1.],
[-0., 4., -0.]])
答案 1 :(得分:2)
您可以使用zip
或itertools.chain.from_iterable
来“解压缩”数组,然后进行串联:
>>> np.concatenate(next(zip(*l)),axis=0)
或
>>> from itertools import chain
>>> np.concatenate([*chain.from_iterable(l)],axis=0)
两种情况下的输出
array([[-3., 3., 3.],
[-3., 3., 3.],
[-3., 3., 3.],
[ 1., 4., 2.],
[-0., 4., -5.],
[ 3., 6., -5.],
[-1., 2., -3.],
[-1., 2., -3.],
[-1., 2., -3.],
[-2., 2., 1.],
[-0., 4., -0.]])
两者都很快:
>>> timeit(lambda:np.concatenate(next(zip(*l)),axis=0))
1.8132231349591166
>>> timeit(lambda:np.concatenate([*chain.from_iterable(l)],axis=0))
1.730023997137323
>>> timeit(lambda:np.vstack(np.ravel(l)))
7.647858377080411