Python 如果原始数据类型未知,从字节加载时如何查找numpy重新数组的数据类型
我正试图从一些缓冲区数据构造一个numpy重新数组,其中保留数组转换为bytes对象时出现的列名非常重要 一个简短的例子说明了我想做什么: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
将熊猫作为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)