Python 重塑和堆叠二维阵列以形成三维阵列

Python 重塑和堆叠二维阵列以形成三维阵列,python,arrays,numpy,reshape,Python,Arrays,Numpy,Reshape,我有一个如下的数据帧 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] , [

我有一个如下的数据帧

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:

案例2:


尝试
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]]])

我一直都知道你的速度会更快+1.
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.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]]])