2013-10-01 3 views
3

У меня есть несколько файлов hdf5, каждый из которых имеет ту же структуру. Я хотел бы создать из них pytable, как-то слияние файлов hdf5.слияние нескольких файлов hdf5 в один pytable

Я имею в виду, что если массив в файле1 имеет размер x и массив в файле2 имеет размер y, результирующий массив в pytable будет иметь размер x + y, содержащий сначала все записи из файла1, а затем все записи из файла2.

ответ

4

Как вы хотите это сделать, это немного зависит от типа данных, который у вас есть. Массивы и CArrays имеют статический размер, поэтому вам необходимо предварительно распределить пространство данных. Таким образом, вы бы сделали примерно следующее:

import tables as tb 
file1 = tb.open_file('/path/to/file1', 'r') 
file2 = tb.open_file('/path/to/file2', 'r') 
file3 = tb.open_file('/path/to/file3', 'r') 
x = file1.root.x 
y = file2.root.y 

z = file3.create_array('/', 'z', atom=x.atom, shape=(x.nrows + y.nrows,)) 
z[:x.nrows] = x[:] 
z[x.nrows:] = y[:] 

Однако EArrays and Tables можно расширять. Таким образом, вам не нужно предварительно распределять размер и вместо этого использовать copy_node() и append().

import tables as tb 
file1 = tb.open_file('/path/to/file1', 'r') 
file2 = tb.open_file('/path/to/file2', 'r') 
file3 = tb.open_file('/path/to/file3', 'r') 
x = file1.root.x 
y = file2.root.y 

z = file1.copy_node('/', name='x', newparent=file3.root, newname='z') 
z.append(y) 
+0

Это может быть очевидно, но я не понимаю, что делают последние две строки. Предполагается ли, что это объединенный выходной файл? Эти две линии делают то же самое? Возможно ли уточнить имена и определения переменных здесь? – aarslan

+0

Файл, который нужно записать, должен быть открыт в режиме добавления (или записи). Поэтому используйте '' a'' вместо '' r'' при открытии 'file3'. – 153957

+0

для того, чтобы этот пример работал, мне также пришлось изменить окончательную строку на: 'z.append (y [:])' – user3197748

Смежные вопросы