如何将从 C++ 获得的数组转换为 Python 中的 2D numpy 数组而不使用 for 循环

How to convert my array obtained from C++ to a 2D numpy array in Python without for loop

我在 C++ 中使用 numpy C api 并在 python 中得到以下数组:

>>> my_array
array([array([20211101., 20211101., 20211101., 20211101., 20211101.]),
       array([10601155, 10603088, 10603982, 10600983, 10603283], dtype=int32),
       array([30000011, 30000021, 30000031, 30000041, 30000051], dtype=int32),
       array([93003000., 93003000., 93003000., 93003000., 93003000.]),
       array([-1., -1., -1.,  1., -1.]),
       array([b'Sell', b'Sell', b'Sell', b'Buy', b'Sell'], dtype='|S4'),
       array([b'SQZ', b'SQZ', b'SQZ', b'SQZ', b'SQZ'], dtype='|S4'),
       array([ 100, 1100,  100,  200,  200], dtype=int32),
       array([34.19,  9.97, 29.46,  8.96, 27.85]),
      array([b'5', b'0', b'5', b'0', b'0'], dtype='|S4')], dtype=object)

这个数组的形状是

>>> my_array.shape
(10,)

我的目的是将此数组切换为 2D numpy 数组并通过 pd.DataFrame(data=my_array) 创建数据框。但是我没有这样做,因为我应该输入一些像

这样的 numpy 数组
np.array([[...],[...],[...],...])

没有

array([array([...]),array([...]),array([...]),...])

我知道我可以使用for循环来获取数据帧,但是如果数据集很大,速度会很慢。那么有什么方法可以将我的数组转换为真正的 2D numpy 数组并获取数据框对象吗?

根据您的样本制作清单:

In [132]: alist
Out[132]: 
[array([20211101., 20211101., 20211101., 20211101., 20211101.]),
 array([10601155, 10603088, 10603982, 10600983, 10603283], dtype=int32),
 array([30000011, 30000021, 30000031, 30000041, 30000051], dtype=int32),
 array([93003000., 93003000., 93003000., 93003000., 93003000.]),
 array([-1., -1., -1.,  1., -1.]),
 array([b'Sell', b'Sell', b'Sell', b'Buy', b'Sell'], dtype='|S4'),
 array([b'SQZ', b'SQZ', b'SQZ', b'SQZ', b'SQZ'], dtype='|S4'),
 array([ 100, 1100,  100,  200,  200], dtype=int32),
 array([34.19,  9.97, 29.46,  8.96, 27.85]),
 array([b'5', b'0', b'5', b'0', b'0'], dtype='|S4')]

使用 'list transpose' 创建元组列表,每个帧的“row/record”一个:

In [133]: df = pd.DataFrame([tuple(x) for x in zip(*alist)])
In [134]: df
Out[134]: 
            0         1         2           3  ...       6     7      8     9
0  20211101.0  10601155  30000011  93003000.0  ...  b'SQZ'   100  34.19  b'5'
1  20211101.0  10603088  30000021  93003000.0  ...  b'SQZ'  1100   9.97  b'0'
2  20211101.0  10603982  30000031  93003000.0  ...  b'SQZ'   100  29.46  b'5'
3  20211101.0  10600983  30000041  93003000.0  ...  b'SQZ'   200   8.96  b'0'
4  20211101.0  10603283  30000051  93003000.0  ...  b'SQZ'   200  27.85  b'0'

[5 rows x 10 columns]

由于子数组的长度都相同,因此从中创建对象数组需要一些特殊处理。我们不能只 copy-n-paste 你的显示器。

In [135]: arr = np.zeros(len(alist),object)
In [136]: arr[:] = alist

这将创建一个像您的一样的一维数组,它将与列表一起工作

In [138]: df = pd.DataFrame([tuple(x) for x in zip(*arr)])

pandas 可能有另一种创建框架的方法,每个列表的数组有一个 column/series,但这是我能从 numpy 基础上做的最好的。