Я анализирую некоторые данные изображения, состоящие из больших трехмерных массивов интенсивности пикселей с размерами [frame, x, y]
. Поскольку они обычно слишком велики для хранения в памяти, они размещаются на жестком диске в виде массивов PyTables.
Что я хотел бы сделать, так это считывать интенсивность в произвольном подмножестве пикселей во всех кадрах. Естественным способом сделать это кажется индексирование списка:
import numpy as np
import tables
tmph5 = tables.open_file('temp.hdf5', 'w')
bigarray = tmph5.create_array('/', 'bigarray', np.random.randn(1000, 200, 100))
roipixels = [[0, 1, 2, 4, 6], [34, 35, 36, 40, 41]]
roidata = bigarray[:, roipixels[0], roipixels[1]]
# IndexError: Only one selection list is allowed
К сожалению, кажется, что PyTables в настоящее время поддерживает только один набор индексов списка. Еще одна проблема заключается в том, что индекс списка не может содержать дубликаты — я не мог одновременно читать пиксели [1, 2]
и [1, 3]
, так как мой список координат x пикселей содержал бы [1, 1]
. Я знаю, что могу перебирать строки в массиве:
roidata = np.asarray([row[roipixels[0], roipixels[1]] for row in bigarray])
но эти итеративные чтения становятся довольно медленными для большого количества кадров, которые я обрабатываю.
Есть ли более приятный способ сделать это? Я относительно новичок в PyTables, поэтому, если у вас есть какие-либо советы по организации наборов данных в больших массивах, я был бы рад их услышать.
h5py
гораздо более естественен для нетабличных данных. Однако в этом случае у него есть то же ограничение. - person Joe Kington   schedule 17.06.2012