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

2024-10-03 02:40:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个巨大的2d numpy列表数组(dtypeobject),我想把它转换成一个dtypefloat的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将要求第三级成为数组的一部分。我想知道,有没有相对有效的方法

目前,我只是计算维度,创建空数组并逐个填充值,这看起来并不是一个好的解决方案


Tags: importnumpy元素列表stackasnp情况
2条回答

这里是问题的作者

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

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,并将其转置回去

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.]])

相关问题 更多 >