如果原始数据类型未知,从字节加载时如何查找numpy重新数组的数据类型

2024-04-20 00:43:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图从一些缓冲区数据构造一个numpy重新数组,其中保留数组转换为bytes对象时出现的列名非常重要

一个简短的例子说明了我想做什么:

import pandas as pd
import numpy as np

asDF = pd.DataFrame(np.random.random((5,5)),index=np.linspace(-10,0,5),columns=np.linspace(0,1,5)) # Just need a quick way to make a record array with column titles
DFasRec = asDF.to_records()
RecAsStr = DFasRec.tobytes()
# Now I want to get my DFasRec back
recarr = np.frombuffer(RecAsStr)
asArr = np.rec.array(recarr)

注意,我可以假设数据和列标题都是浮动(这是位置数据,因此列标题和数据的第一列表示x/y坐标)

这是可行的——但是,在这个过程中,列标题/数据类型丢失了。如果我知道原始数据类型,我可以恢复原始数组。即:

recarr = np.frombuffer(RecAsStr,dtype=DFasRec.dtype)

但我不能假设我有这个信息。是否有办法在加载过程中提取此数据,或在tobytes()转换过程中嵌入此数据,以便稍后提取?作为旁注,这个转换过程是在往返SQLite数据库的过程中发生的,因此我不能选择将文件与数据类型等一起保存


Tags: to数据importnumpy标题过程asnp
1条回答
网友
1楼 · 发布于 2024-04-20 00:43:21

因此,您的数据帧是:

In [129]: asDF                                                                  
Out[129]: 
           0.00      0.25      0.50      0.75      1.00
-10.0  0.161848  0.381348  0.274634  0.207572  0.620306
-7.5   0.397057  0.291996  0.641298  0.091828  0.143980
-5.0   0.571381  0.933822  0.323190  0.979055  0.749772
-2.5   0.389751  0.907248  0.971688  0.395117  0.135636
 0.0   0.860973  0.614596  0.302016  0.991079  0.498841

重新排列表单将行索引作为一个额外字段(可选):

In [130]: DFasRec                                                               
Out[130]: 
rec.array([(-10. , 0.16184848, 0.38134831, 0.27463366, 0.20757185, 0.62030599),
           ( -7.5, 0.39705653, 0.291996  , 0.64129751, 0.09182781, 0.14398041),
           ( -5. , 0.57138102, 0.9338216 , 0.32318977, 0.97905532, 0.74977176),
           ( -2.5, 0.38975072, 0.90724842, 0.97168799, 0.39511716, 0.13563595),
           (  0. , 0.86097342, 0.61459591, 0.30201566, 0.99107931, 0.49884148)],
          dtype=[('index', '<f8'), ('0.0', '<f8'), ('0.25', '<f8'), ('0.5', '<f8'), ('0.75', '<f8'), ('1.0', '<f8')])
In [131]: DFasRec.dtype.names                                                   
Out[131]: ('index', '0.0', '0.25', '0.5', '0.75', '1.0')

列名在dtype中,但不在数组数据本身中

用普通的arr1 = np.frombuffer(RecAsStr)

In [132]: arr1                                                                  
Out[132]: 
array([-10.        ,   0.16184848,   0.38134831,   0.27463366,
         0.20757185,   0.62030599,  -7.5       ,   0.39705653,
         0.291996  ,   0.64129751,   0.09182781,   0.14398041,
        -5.        ,   0.57138102,   0.9338216 ,   0.32318977,
         0.97905532,   0.74977176,  -2.5       ,   0.38975072,
         0.90724842,   0.97168799,   0.39511716,   0.13563595,
         0.        ,   0.86097342,   0.61459591,   0.30201566,
         0.99107931,   0.49884148])

这只是一个一维数组;它可以工作(到目前为止),因为字段都是float,默认的loaddtype是float。该缓冲区没有关于数据类型的信息

重塑允许我们恢复具有行索引值的二维数组

In [133]: arr1.reshape(-1,6)                                                    
Out[133]: 
array([[-10.        ,   0.16184848,   0.38134831,   0.27463366,
          0.20757185,   0.62030599],
       [ -7.5       ,   0.39705653,   0.291996  ,   0.64129751,
          0.09182781,   0.14398041],
       [ -5.        ,   0.57138102,   0.9338216 ,   0.32318977,
          0.97905532,   0.74977176],
       [ -2.5       ,   0.38975072,   0.90724842,   0.97168799,
          0.39511716,   0.13563595],
       [  0.        ,   0.86097342,   0.61459591,   0.30201566,
          0.99107931,   0.49884148]])

bytes路由不存储任何dtype信息。我认为这必须单独保存(或恢复)

例如:

In [146]: str(DFasRec.dtype)                                                    
Out[146]: "(numpy.record, [('index', '<f8'), ('0.0', '<f8'), ('0.25', '<f8'), ('0.5', '<f8'), ('0.75', '<f8'), ('1.0', '<f8')])"
In [147]: dt = np.dtype(eval(_))                                                
In [148]: dt                                                                    
Out[148]: dtype((numpy.record, [('index', '<f8'), ('0.0', '<f8'), ('0.25', '<f8'), ('0.5', '<f8'), ('0.75', '<f8'), ('1.0', '<f8')]))
In [149]: np.frombuffer(RecAsStr, dt)                 

相关问题 更多 >