簡體   English   中英

如何將從 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)創建一個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM