Matriks HDF5 ditambahkan dengan python

Misalnya kita memiliki matriks (misalnya kita ingin menyimpan array numpy) dan kita menyimpannya dalam file HDF5, tapi kemudian kita ingin memperluas matriks dengan menambahkan beberapa baris ke akhir matriks asli (perhatikan bahwa matriks asli bisa sangat besar ~puluhan Gb dan tidak dapat dimuat ke dalam RAM)

Kami juga ingin memiliki kemampuan untuk membaca beberapa baris dari matriks dari titik mana pun (mungkin disebut irisan(?)) tanpa memuat seluruh matriks dalam RAM.

Adakah yang bisa memberikan contoh bagaimana hal itu bisa dilakukan dengan python?

PEMBARUAN:

Saya pikir pilihan lain adalah numpy.memmap , tapi sepertinya tidak ada tambahannya.

Ini sepertinya juga merupakan opsi tetapi beroperasi dengan data biner mentah , tetapi saya ingin memiliki akses ke matriks. Saya juga tidak tahu bagaimana melakukan append dalam kasus ini.


person mrgloom    schedule 11.10.2013    source sumber


Jawaban (1)


Jika Anda akan bekerja dengan file HDF5, izinkan saya menyarankan menggunakan salah satu perpustakaan yang tersedia, seperti Pytables. Saya memposting dan menyederhanakan tutorial mereka di sini: http://pytables.github.io/usersguide/tutorials.html

from tables import *

# Define a user record to characterize some kind of particles
class Particle(IsDescription):
    name      = StringCol(16)   # 16-character String
    idnumber  = Int64Col()      # Signed 64-bit integer
    ADCcount  = UInt16Col()     # Unsigned short integer
    TDCcount  = UInt8Col()      # unsigned byte
    grid_i    = Int32Col()      # integer
    grid_j    = Int32Col()      # integer
    pressure  = Float32Col()    # float  (single-precision)
    energy    = FloatCol()      # double (double-precision)

filename = "test.h5"
# Open a file in "w"rite mode
h5file = openFile(filename, mode = "w", title = "Test file")
# Create a new group under "/" (root)
group = h5file.createGroup("/", 'detector', 'Detector information')
# Create one table on it
table = h5file.createTable(group, 'readout', Particle, "Readout example")
# Fill the table with 10 particles
particle = table.row
for i in xrange(10):
    particle['name']  = 'Particle: %6d' % (i)
    particle['TDCcount'] = i % 256
    particle['ADCcount'] = (i * 256) % (1 << 16)
    particle['grid_i'] = i
    particle['grid_j'] = 10 - i
    particle['pressure'] = float(i*i)
    particle['energy'] = float(particle['pressure'] ** 4)
    particle['idnumber'] = i * (2 ** 34)
    # Insert a new particle record
    particle.append()
# Close (and flush) the file
h5file.close()

#now we will append some data to the table, after taking some slices 
f=tables.openFile(filename, mode="a")
f.root.detector
f.root.detector.readout
f.root.detector.readout[1::3]
f.root.detector.readout.attrs.TITLE
ro = f.root.detector.readout

#generators work
[row['energy'] for row in ro.where('pressure > 10')]


#append some data
table = f.root.detector.readout
particle = table.row
for i in xrange(10, 15):
  particle['name']  = 'Particle: %6d' % (i)
  particle['TDCcount'] = i % 256
  particle['ADCcount'] = (i * 256) % (1 << 16)
  particle['grid_i'] = i
  particle['grid_j'] = 10 - i
  particle['pressure'] = float(i*i)
  particle['energy'] = float(particle['pressure'] ** 4)
  particle['idnumber'] = i * (2 ** 34)
  particle.append()
table.flush()
f.close()
person Paul    schedule 11.10.2013