簡體   English   中英

重塑和堆疊2D陣列以形成3D陣列

[英]Reshaping and stacking a 2D array to form a 3D array

我有一個數據框如下

df = pd.DataFrame({'a':[1,1,1,2,2,2], 
                   'b': [10, 20, 30, 20, 40, 60],
                  'c': [80, 80, 80, 120, 120, 120]})

我想獲得3D陣列

array([[[  1,  10,  80],
       [  2,  20, 120] ],

       [[  1,  20,  80] ,
       [  2,  40, 120] ],

       [[  1,  30,  80],
        [  2,  60, 120]]], dtype=int64)

我喜歡這樣

values = df.values
values.reshape(3, 2, 3)

並得到不正確的數組。 如何獲得期望的數組?

獲取數組數據,然后將第一個軸拆分為兩個,第一個軸的長度為2從而為我們提供3D數組,然后交換這兩個軸,

df.values.reshape(2,-1,df.shape[1]).swapaxes(0,1)

樣品運行-

In [711]: df
Out[711]: 
   a   b    c
0  1  10   80
1  1  20   80
2  1  30   80
3  2  20  120
4  2  40  120
5  2  60  120

In [713]: df.values.reshape(2,-1,df.shape[1]).swapaxes(0,1)
Out[713]: 
array([[[  1,  10,  80],
        [  2,  20, 120]],

       [[  1,  20,  80],
        [  2,  40, 120]],

       [[  1,  30,  80],
        [  2,  60, 120]]])

這使我們無需復制即可查看原始數據,因此具有最小的恆定時間。

運行時測試

情況1 :

In [730]: df = pd.DataFrame(np.random.randint(0,9,(2000,100)))

# @cᴏʟᴅsᴘᴇᴇᴅ's soln
In [731]: %timeit np.stack(np.split(df.values, 2), axis=1)
10000 loops, best of 3: 109 µs per loop

In [732]: %timeit df.values.reshape(2,-1,df.shape[1]).swapaxes(0,1)
100000 loops, best of 3: 8.55 µs per loop

案例2:

In [733]: df = pd.DataFrame(np.random.randint(0,9,(2000,2000)))

# @cᴏʟᴅsᴘᴇᴇᴅ's soln
In [734]: %timeit np.stack(np.split(df.values, 2), axis=1)
100 loops, best of 3: 4.3 ms per loop

In [735]: %timeit df.values.reshape(2,-1,df.shape[1]).swapaxes(0,1)
100000 loops, best of 3: 8.37 µs per loop

嘗試np.split + np.stack

np.stack(np.split(df.values, 2), axis=1)

array([[[  1,  10,  80],
        [  2,  20, 120]],

       [[  1,  20,  80],
        [  2,  40, 120]],

       [[  1,  30,  80],
        [  2,  60, 120]]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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