[英]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)
創建一個 dataframe 。 但是我沒有這樣做,因為我應該輸入一些 numpy 數組,比如
np.array([[...],[...],[...],...])
不是
array([array([...]),array([...]),array([...]),...])
我知道我可以使用 for 循環來獲取 dataframe,但是如果數據集很大,速度會很慢。 那么有什么方法可以將我的數組轉換為真正的二維 numpy 數組並得到 dataframe object?
從您的樣本中列出:
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')]
使用“列表轉置”制作元組列表,每個幀的“行/記錄”一個:
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]
由於子數組的長度都相同,因此從中生成 object 數組需要一些特殊處理。 我們不能只是復制粘貼您的顯示。
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
可能有另一種方法來創建一個框架,每個列表的數組有一個列/系列,但這是我能從numpy
基地做的最好的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.