有没有办法将 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
【问题讨论】:
你能从phone
和signal
数组中放一些样本数据行
一个数据框基本上是二维的。
【参考方案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 数组并仍保持原始形状?的主要内容,如果未能解决你的问题,请参考以下文章