Domanda

Sono nuovo di PyTables, e guardo, utilizzando per l'elaborazione di dati generati da un agente di modellazione basati su simulazione e memorizzati in HDF5.Sto lavorando con un 39 MB di file di test, e sto incontrando qualche stranezza.Ecco il layout della tabella:

    /example/agt_coords (Table(2000000,)) ''
  description := {
  "agent": Int32Col(shape=(), dflt=0, pos=0),
  "x": Float64Col(shape=(), dflt=0.0, pos=1),
  "y": Float64Col(shape=(), dflt=0.0, pos=2)}
  byteorder := 'little'
  chunkshape := (20000,)

Ecco come ho accesso in Python:

from tables import *
>>> h5file = openFile("alternate_hose_test.h5", "a")

h5file.root.example.agt_coords
/example/agt_coords (Table(2000000,)) ''
  description := {
  "agent": Int32Col(shape=(), dflt=0, pos=0),
  "x": Float64Col(shape=(), dflt=0.0, pos=1),
  "y": Float64Col(shape=(), dflt=0.0, pos=2)}
  byteorder := 'little'
  chunkshape := (20000,)
>>> coords = h5file.root.example.agt_coords

Ora qui è dove le cose si fanno strane.

[x for x in coords[1:100] if x['agent'] == 1]
[(1, 25.0, 78.0), (1, 25.0, 78.0)]
>>> [x for x in coords if x['agent'] == 1]
[(1000000, 25.0, 78.0), (1000000, 25.0, 78.0)]
>>> [x for x in coords.iterrows() if x['agent'] == 1]
[(1000000, 25.0, 78.0), (1000000, 25.0, 78.0)]
>>> [x['agent'] for x in coords[1:100] if x['agent'] == 1]
[1, 1]
>>> [x['agent'] for x in coords if x['agent'] == 1]
[1, 1]

Non capisco perché i valori sono sbagliato quando ho scorrere tutta la tabella, ma non quando prendo un piccolo sottoinsieme dell'insieme di righe.Sono sicuro che questo è un errore in quanto sto utilizzando la libreria, in modo che qualsiasi aiuto in questa materia sarebbe molto apprezzato.

È stato utile?

Soluzione

Questo è un punto comune di confusione quando scorrendo Table oggetto

Quando scorrere un Table il tipo di elemento che si ottiene non è che i dati a voce, ma una funzione di accesso alla tabella alla riga corrente.Quindi, con

[x for x in coords if x['agent'] == 1]

creazione di un elenco di fila funzioni di accesso che puntano a "corrente" riga della tabella, l'ultima riga.Ma quando lo si fa

[x["agent"] for x in coords if x['agent'] == 1]

si utilizza la funzione di accesso come si compila l'elenco.

La soluzione per ottenere tutti i dati necessari come si compila l'elenco, utilizzando la funzione di accesso a ogni iterazione.Ci sono due opzioni

[x[:] for x in coords if x['agent'] == 1]

o

[x.fetch_all_fields() for x in coords if x['agent'] == 1]

L'ex costruisce una lista di tuple.Quest'ultimo restituisce un NumPy void oggetto.IIRC, la seconda è più veloce, ma il primo potrebbe avere più senso per voi scopi.

Ecco una buona spiegazione dal PyTables sviluppatore. Nelle versioni future, la stampa di una riga di una funzione di accesso oggetto non può semplicemente mostrare i dati, ma che si tratta di una funzione di accesso di riga dell'oggetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top