如何将浮点数列表的2d np.array转换为2d浮点数np.array,将列表值堆叠到行

时间:2019-10-25 14:39:15

标签: python arrays numpy

我有一个巨大的列表(dtype object的2d numpy数组,我想将其转换为dtype float的2d numpy数组,将列表所表示的维度堆叠到第0轴(行) )。每行中的列表始终具有完全相同的长度,并且至少包含一个元素。

这里是情况的最小再现:

import numpy as np
current_array = np.array(
    [[[0.0], [1.0]], 
    [[2.0, 3.0], [4.0, 5.0]]]
)
desired_array = np.array(
    [[0.0, 1.0], 
    [2.0, 4.0],
    [3.0, 5.0]]
)

我到处寻找解决方案,并且stackdstack函数仅在第一级为元组时才起作用。 reshape将要求第三级成为数组的一部分。我想知道,有没有相对有效的方法?

当前,我只是计算尺寸,创建空数组并逐个填充值,老实说这似乎不是一个好的解决方案。

2 个答案:

答案 0 :(得分:1)

In [321]: current_array = np.array( 
     ...:     [[[0.0], [1.0]],  
     ...:     [[2.0, 3.0], [4.0, 5.0]]] 
     ...: )                                                                     
In [322]: current_array                                                         
Out[322]: 
array([[list([0.0]), list([1.0])],
       [list([2.0, 3.0]), list([4.0, 5.0])]], dtype=object)
In [323]: _.shape                                                               
Out[323]: (2, 2)

返工两行:

In [328]: current_array[1,:]                                                    
Out[328]: array([list([2.0, 3.0]), list([4.0, 5.0])], dtype=object)
In [329]: np.stack(current_array[1,:],1)                                        
Out[329]: 
array([[2., 4.],
       [3., 5.]])

In [330]: np.stack(current_array[0,:],1)                                        
Out[330]: array([[0., 1.]])

组合它们:

In [331]: np.vstack((_330, _329))                                               
Out[331]: 
array([[0., 1.],
       [2., 4.],
       [3., 5.]])

一行:

In [333]: np.vstack([np.stack(row, 1) for row in current_array])                
Out[333]: 
array([[0., 1.],
       [2., 4.],
       [3., 5.]])

答案 1 :(得分:0)

问题的作者。

我发现一种比逐个填充数组更优雅(且更快)的方式,即:

desired = np.array([np.concatenate([np.array(d) for d in lis]) for lis in current.T]).T
print(desired)
'''
[[0. 1.]
 [2. 4.]
 [3. 5.]]
 '''

但是它仍然可以执行很多操作。它可以对表进行转置,以便能够用np.concatenate堆叠相邻的“维度”(其中之一是列表),然后将结果转换为np.array并转回。