1

(この質問は元の作成者によって変更されており、サンプル コードは変更されているため、お使いのマシンで実行できます)

時系列データをpytablesにロードしています(このテストケースでは、最大200万行、23列のほとんどが浮動小数点値です)。また、同じpytableファイルに、同じ数の行と列、および列名を持つ対応するテーブルを作成したいと思いますが、品質管理の「マスク」として使用されるint8データ型を使用します。これを行うには、データ テーブルから列名と行数情報を取得し、これを使用して、品質管理 pytable テーブルの作成/追加に使用される numpy ゼロ レコード配列を作成します。

この問題は、numpy ゼロ レコード配列を新しい「マスク」pytable に追加すると発生します。pytable の作成/追加に使用される numpy ゼロ レコード配列は正しいサイズですが、結果の pytable は予想よりもかなり大きくなります。

次の実行可能なコード例は、問題を示しています。pytable を作成し、値がゼロのレコードの「nrows」を含むテーブルを作成することを期待して、numpy zero rearrays をテーブルに追加します。結果の pytable には、Vitables で表示したときに予想よりも多くの行があります

これらの余分なデータ行がどこから来ているのかわかりませんか? 任意の提案をいただければ幸いです。

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 zero rearrays が品質管理 pytable に書き込まれるときに作成される print ステートメントの出力です。

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 に答える