我有一个巨大的列表(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]]
)
我到处寻找解决方案,并且stack
和dstack
函数仅在第一级为元组时才起作用。 reshape
将要求第三级成为数组的一部分。我想知道,有没有相对有效的方法?
当前,我只是计算尺寸,创建空数组并逐个填充值,老实说这似乎不是一个好的解决方案。
答案 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
并转回。