J'analyse des données d'imagerie qui consistent en de grandes matrices tridimensionnelles d'intensités de pixels avec les dimensions suivantes [frame, x, y]
. Comme ils sont généralement trop gros pour être stockés en mémoire, ils résident sur le disque dur sous forme de tableaux PyTables.
Ce que j'aimerais pouvoir faire, c'est lire les intensités d'un sous-ensemble arbitraire de pixels dans toutes les images. La façon naturelle de le faire semble être l'indexation par liste :
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
Malheureusement, il semble que PyTables ne supporte actuellement qu'un seul ensemble d'indices de liste. Un autre problème est qu'un index de liste ne peut pas contenir de doublons - je n'ai pas pu lire simultanément des pixels [1, 2]
y [1, 3]
puisque ma liste de coordonnées x des pixels contiendrait [1, 1]
. Je sais que je peux itérer sur les lignes du tableau :
roidata = np.asarray([row[roipixels[0], roipixels[1]] for row in bigarray])
mais ces lectures itératives deviennent assez lentes pour le grand nombre d'images que je traite.
Existe-t-il une façon plus agréable de procéder ? Je suis relativement nouveau dans l'utilisation de PyTables, donc si vous avez des conseils pour organiser des ensembles de données dans de grands tableaux, j'aimerais les entendre.