有没有办法将 numpy 数组转换为数据框,然后再转换回 numpy 数组并仍保持原始形状?

Posted

技术标签:

【中文标题】有没有办法将 numpy 数组转换为数据框,然后再转换回 numpy 数组并仍保持原始形状?【英文标题】:Is there a way to convert a numpy array to a dataframe then back to numpy array and still maintain the original shape? 【发布时间】:2020-12-25 12:48:42 【问题描述】:

我从带有dtype 的npz 文件中加载了2 个numpy 数组; float64 & int64,一个形状为(10, 16, 12)。在这段代码中,我尝试将一个 numpy 数组转换为一个数据帧(对于一些必要的操作),但是当我将它转换回一个 numpy 数组时,形状和 dtype 会发生变化。有没有办法在这些转换之后保持原始形状和 dtype?

代码:

  signal=np.load(os.path.join(rootdir+"/sample.npz"))['signal']
  phone=np.load(os.path.join(rootdir+"/sample.npz"))['phone']

  
  print('Original Shape: ',signal.shape)
  print('Original Type: ',signal.dtype)

  data= pd.DataFrame(data=[phone, signal]).T

  print(data)

  signal=data[1].to_numpy()  
  print('Shape after: ', signal.shape)
  print('dtype after: ', signal.dtype)

结果:

Original Shape:  (10, 16, 12)
Original Type:  float64

    0                                                  1
0  42  [[-452.47690531599665, -457.24038307019396, -4...
1  48  [[-494.8202341648372, -489.2340925175253, -500...
2  49  [[-554.1111558403246, -552.5063435313488, -558...
3  60  [[-665.291405811076, -665.1201642439147, -671....
4  22  [[-718.6366745080356, -660.6800599663317, -645...
5  60  [[-867.7087743391858, -864.8980417191354, -863...
6  18  [[-538.0778606068621, -534.2985294058773, -563...
7  45  [[-417.18912118190144, -419.8508768049619, -43...
8  20  [[-597.9549743414366, -580.0114092551831, -561...
9  60  [[-704.9264411271377, -692.1625931932991, -689...

Shape after: (10,)
dtype after: object

【问题讨论】:

你能从phonesignal数组中放一些样本数据行 一个数据框基本上是二维的。 【参考方案1】:

用更简单的 3d 数组进行实验:

In [95]: arr = np.arange(24).reshape(3,2,4)
In [96]: df = pd.DataFrame(data=[np.arange(3), arr]).T
In [97]: df
Out[97]: 
   0                                     1
0  0          [[0, 1, 2, 3], [4, 5, 6, 7]]
1  1    [[8, 9, 10, 11], [12, 13, 14, 15]]
2  2  [[16, 17, 18, 19], [20, 21, 22, 23]]
In [98]: df.to_numpy()
Out[98]: 
array([[0, array([[0, 1, 2, 3],
       [4, 5, 6, 7]])],
       [1, array([[ 8,  9, 10, 11],
       [12, 13, 14, 15]])],
       [2, array([[16, 17, 18, 19],
       [20, 21, 22, 23]])]], dtype=object)

只提取一列/系列:

In [99]: df[1].to_numpy()
Out[99]: 
array([array([[0, 1, 2, 3],
       [4, 5, 6, 7]]),
       array([[ 8,  9, 10, 11],
       [12, 13, 14, 15]]),
       array([[16, 17, 18, 19],
       [20, 21, 22, 23]])], dtype=object)
In [100]: np.stack(_)
Out[100]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]],

       [[16, 17, 18, 19],
        [20, 21, 22, 23]]])
In [101]: _.shape
Out[101]: (3, 2, 4)

数据框有一个二维形状,它也出现在数组中:

In [102]: _98.shape
Out[102]: (3, 2)
In [103]: df.shape
Out[103]: (3, 2)

列系列是 1d。

另一种构造该数据框的方法:

In [108]: pd.DataFrame('x':np.arange(3), 'y':list(arr))
Out[108]: 
   x                                     y
0  0          [[0, 1, 2, 3], [4, 5, 6, 7]]
1  1    [[8, 9, 10, 11], [12, 13, 14, 15]]
2  2  [[16, 17, 18, 19], [20, 21, 22, 23]]

我必须将 3d 数组转换为 2d 数组列表。

可以使用(Out[99] 上的变体)恢复该列表:

In [109]: df[1].tolist()
Out[109]: 
[array([[0, 1, 2, 3],
        [4, 5, 6, 7]]),
 array([[ 8,  9, 10, 11],
        [12, 13, 14, 15]]),
 array([[16, 17, 18, 19],
        [20, 21, 22, 23]])]

【讨论】:

这确实有效。谢谢!!!所以基本上 Numpy -> Dataframe -> List -> Numpy.

以上是关于有没有办法将 numpy 数组转换为数据框,然后再转换回 numpy 数组并仍保持原始形状?的主要内容,如果未能解决你的问题,请参考以下文章

将数据框转换为 Numpy 数组 [重复]

将numpy数组转换为数据框[重复]

将两个numpy数组转换为数据框

将数据框转换为 numpy 数组? [复制]

将Stl转换为numpy数组

按标签分隔数据框(将数据框转换为 numpy 数组)