【发布时间】:2017-03-30 21:49:04
【问题描述】:
我正在寻找一种快速的方法来将我的 hdf 文件集合设置为一个 numpy 数组,其中每一行都是图像的扁平版本。我的意思是:
除了其他信息之外,我的 hdf 文件还存储每帧图像。每个文件包含 51 帧和 512x424 图像。现在我有 300 多个 hdf 文件,我希望将图像像素存储为每帧一个矢量,其中所有图像的所有帧都存储在一个 numpy ndarray 中。下图应该有助于理解:
到目前为止,我得到的是一个非常慢的方法,我实际上不知道如何让它更快。问题是我认为我的最终数组被调用得太频繁了。因为我观察到第一个文件加载到数组中的速度非常快,但速度下降得很快。 (通过打印当前hdf文件的编号来观察)
我当前的代码:
os.chdir(os.getcwd()+"\\datasets")
# predefine first row to use vstack later
numpy_data = np.ndarray((1,217088))
# search for all .hdf files
for idx, file in enumerate(glob.glob("*.hdf5")):
f = h5py.File(file, 'r')
# load all img data to imgs (=ndarray, but not flattened)
imgs = f['img']['data'][:]
# iterate over all frames (50)
for frame in range(0, imgs.shape[0]):
print("processing {}/{} (file/frame)".format(idx+1,frame+1))
data = np.array(imgs[frame].flatten())
numpy_data = np.vstack((numpy_data, data))
# delete first row after another is one is stored
if idx == 0 and frame == 0:
numpy_data = np.delete(numpy_data, 0,0)
f.close()
有关更多信息,我需要这个来学习决策树。由于我的 hdf 文件比我的 RAM 大,我认为转换为 numpy 数组可以节省内存,因此更适合。
感谢您的每一个输入。
【问题讨论】:
-
您的算法一次需要多于一帧吗?我猜测速度下降来自对 vstack 的所有调用,您可能不需要做类似的事情。
-
另外,我不确定
if idx == 0 and frame == 0:条件发生了什么。我想你只是从中得到一个 0x217088 元素数组。 -
不幸的是,我将使用使用所有特征空间的随机 forrest。也许还有另一种选择如何用 scikit learn 来喂养他们,但我不知道这样的。
-
@Elliot 提到的行用于删除第一个随机初始化的行。