python - PyTables:索引大型数组的多个维度

标签 python numpy hdf5 pytables

我正在分析一些成像数据,这些数据由像素强度的大型 3 维阵列组成,尺寸为 [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 比较陌生,所以如果您有任何关于在大型数组中组织数据集的提示,我很乐意听取。

最佳答案

无论值(value)如何,我经常对以 hdf 格式存储的 3D 地震数据做同样的事情。

由于嵌套循环,迭代读取很慢。如果你只做一个循环(而不是循环遍历每一行),它会非常快(至少在使用 h5py 时是这样。我通常只使用 pytables 存储类似表的数据)并完全按照您的意愿行事。

在大多数情况下,您需要遍历索引列表,而不是遍历每一行。

基本上,你想要:

roidata = np.vstack([bigarray[:,i,j] for i,j in zip(*roipixels)])

代替:

roidata = np.asarray([row[roipixels[0],roipixels[1]] for row in bigarray])

如果这是您最常见的用例,调整存储数组的 block 大小将大有帮助。在您的情况下,您需要长而窄的 block ,沿第一轴的长度最长。

(注意:我没有用 pytables 测试过它,但它与 h5py 完美配合。)

关于python - PyTables:索引大型数组的多个维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11067916/

相关文章:

python - curl :(7)无法连接到::1:网络无法访问

python - python中线性插值的逻辑错误

python - 美化 Jinja2 模板

python - Numpy python 中的数组索引

python - 如何将 HDF5 数据映射到多个 Python 进程?

python - 处理多个文件时 Ghostscript 发生 fatal error

python - savetxt 如何将类型从 float64 更改为 int 或 double

python - "rank"的 Numpy/scipy 弃用警告

sql - 快速写入/读取数千万个 float32s 嵌入的最佳数据存储是什么?

python - 如何在 python 中将大型 csv 文件写入 hdf5?