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

Python 如果原始数据类型未知,从字节加载时如何查找numpy重新数组的数据类型,python,arrays,pandas,numpy,Python,Arrays,Pandas,Numpy,我正试图从一些缓冲区数据构造一个numpy重新数组,其中保留数组转换为bytes对象时出现的列名非常重要 一个简短的例子说明了我想做什么: 将熊猫作为pd导入 将numpy作为np导入 asDF=pd.DataFrame(np.random.random((5,5)),index=np.linspace(-10,0,5),columns=np.linspace(0,1,5))#只需要一种快速的方法来创建带有列标题的记录数组 DFasRec=asDF.to_记录() RecAsStr=DFasRe

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

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

将熊猫作为pd导入
将numpy作为np导入
asDF=pd.DataFrame(np.random.random((5,5)),index=np.linspace(-10,0,5),columns=np.linspace(0,1,5))#只需要一种快速的方法来创建带有列标题的记录数组
DFasRec=asDF.to_记录()
RecAsStr=DFasRec.tobytes()
#现在我想拿回我的DFasRec
recarr=np.frombuffer(RecAsStr)
asArr=np.rec.array(recarr)
注意,我可以假设数据和列标题都是浮动。(这是位置数据,因此列标题和数据的第一列表示x/y坐标)

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

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

因此您的数据帧是:

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
重新排列表单将行索引作为一个额外字段(可选):

这只是一个一维数组;它可以工作(到目前为止),因为字段都是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]])
字节
路由不存储任何
数据类型
信息。我认为这必须单独保存(或恢复)

例如:

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)                 
[146]中的
:str(DFasRec.dtype)
Out[146]:“(numpy.record,[('index','
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]])
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)