从列表中的嵌套数组创建numpy矩阵

时间:2019-07-12 06:20:24

标签: arrays python-3.x numpy

我的清单如下。

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个需要转换的数组。

2 个答案:

答案 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)

您可以使用zipitertools.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