如何将从 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
基础上做的最好的。
我在 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)
创建数据框。但是我没有这样做,因为我应该输入一些像
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
基础上做的最好的。