1

(本题已被原作者修改,示例代码已修改,以便您可以在自己的机器上运行)

我正在将时间序列数据加载到 pytables 中(在这个测试用例中,大约 200 万行,23 列主要是浮点值)。我还想在同一个 pytable 文件中创建一个相应的表,该表具有相同的行数和列数以及列名,但使用 int8 数据类型作为质量控制“掩码”。为此,我从数据表中检索列名和行计数信息,并使用它来创建用于创建/附加到质量控制 pytable 表的 numpy 零记录数组。

当我将 numpy 零记录数组附加到新的“掩码”pytable 时,就会出现问题。即使用于创建/附加到 pytable 的 numpy 零记录数组是正确的大小 - 生成的 pytable 比预期的要大得多 - pytable 中的更多行然后已从 numpy recarray 附加。

以下可运行的示例代码演示了该问题。它创建了一个 pytable 并将 numpy 零重新数组附加到表中,期望创建一个表,其中包含“nrows”的零值记录。使用 Vitables 查看时,生成的 pytable 的行数比预期的多

我不确定这些额外的数据行来自哪里?任何建议,将不胜感激。

使用 python 2.7.2、pytables 2.3.1、numpy 1.6.1.1

import tables 
import numpy as np
import string as str

Storename   = 'Test.h5'
Storetitle  = 'Test'
PathList    = ['Lvl0','Lvl1']
Tablename   = 'Data'

storeq = tables.openFile(Storename, mode='a', title= Storetitle)

for ix, agroup in enumerate(PathList):
   mypath0 =  '/'+str.strip('/'.join(PathList[0:ix]))
   mypath1 =  '/'+str.strip('/'.join(PathList[0:ix+1]))      
   try:  
      storeq.getNode(mypath1)
   except(tables.exceptions.NoSuchNodeError):        
      storeq.createGroup(mypath0,PathList[ix]) 

pathq = mypath1
qtable = None  

tfields = ['DateTime','f0','f1','f2','f3','f4','f5','f6','f7','f8','f9']
nfields = 11

tformats = ['int64', 'int8', 'int8', 'int8', 'int8', 'int8', 
            'int8', 'int8', 'int8', 'int8', 'int8']

nrows = 2122387
rowchunk = 100000
rowsteps, rowrem = divmod(nrows, rowchunk)

for ix in range(rowsteps):        
  fillarray = np.zeros((rowchunk,nfields), {'names': tfields, 'formats': tformats})
  if qtable==None:
      print('create')      
      qtable    = storeq.createTable(pathq, Tablename, fillarray)       
      qtable.flush()
  else:
      print('append :', ix, fillarray.shape)  
      qtable.append(fillarray)
      qtable.flush()

if rowrem > 0:
  fillarray = np.zeros((rowrem,nfields), {'names': tfields, 'formats': tformats})
  if ix == 0:
     print('create')      
     qtable  = storeq.createTable(pathq,Tablename, fillarray)       
     qtable.flush()
  else:
     print('append :', rowrem, fillarray.shape)  
     qtable.append(fillarray)
     qtable.flush()


qtable.close()
storeq.close()

以下是将 numpy 零重新数组写入质量控制 pytable 时创建的打印语句输出。

create
('append :', 1, (100000, 26))
('append :', 2, (100000, 26))
('append :', 3, (100000, 26))
('append :', 4, (100000, 26))
('append :', 5, (100000, 26))
('append :', 6, (100000, 26))
('append :', 7, (100000, 26))
('append :', 8, (100000, 26))
('append :', 9, (100000, 26))
('append :', 10, (100000, 26))
('append :', 11, (100000, 26))
('append :', 12, (100000, 26))
('append :', 13, (100000, 26))
('append :', 14, (100000, 26))
('append :', 15, (100000, 26))
('append :', 16, (100000, 26))
('append :', 17, (100000, 26))
('append :', 18, (100000, 26))
('append :', 19, (100000, 26))
('append :', 20, (100000, 26))
('append :', 22387, (22387, 26))
4

1 回答 1

0

鉴于问题的年龄,我想作者已经有了答案......但以防万一,这是我的(未经测试):

在示例代码的第 45 行,您创建了一个 shape 的结构化数组(rowchunk, nfields):这是错误的,因为结构化数组必须是 1D(行数),字段的数量、名称和格式由dtype参数设置。

因此你应该使用类似的东西

fillarray = np.zeros(rowchunk, dtype={'names': tfields, 'formats': tformats})
于 2013-08-22T05:53:38.463 回答