使用python(numpy memmap,pytables或其他?)对巨大矩阵进行快速下采样
Posted
技术标签:
【中文标题】使用python(numpy memmap,pytables或其他?)对巨大矩阵进行快速下采样【英文标题】:fast downsampling of huge matrix using python (numpy memmap, pytables or other?) 【发布时间】:2017-05-18 08:40:48 【问题描述】:作为数据处理的一部分,我生成了 100000*100000 个单元格的巨大非稀疏矩阵,我想将其下采样 10 倍以减少数据量。在这种情况下,我想对 10*10 像素的块进行平均,以将矩阵的大小从 100000*100000 减小到 10000*10000。
使用python最快的方法是什么?是否需要将原始数据保存为新的数据格式对我来说并不重要,因为我必须多次对同一数据集进行下采样。
目前我正在使用 numpy.memmap:
import numpy as np
data_1 = 'data_1.dat'
date_2 = 'data_2.dat'
lines = 100000
pixels = 100000
window = 10
new_lines = lines / window
new_pixels = pixels / window
dat_1 = np.memmap(data_1, dtype='float32', mode='r', shape=(lines, pixels))
dat_2 = np.memmap(data_2, dtype='float32', mode='r', shape=(lines, pixels))
dat_in = dat_1 * dat_2
dat_out = dat_in.reshape([new_lines, window, new_pixels, window]).mean(3).mean(1)
但是对于大文件,这种方法会变得非常慢。这可能与这些文件的二进制数据有关,这些文件按行排序。因此,我认为将我的数据存储在块中而不是行中的数据格式会更快,但我不确定性能提升会是什么以及是否有支持这一点的 python 包。
在创建如此庞大的矩阵(此处未显示)之前,我也考虑过对数据进行下采样,但我的输入数据是断裂且不规则的,因此会变得非常复杂。
【问题讨论】:
【参考方案1】:基于this answer,我认为这可能是一种相对较快的方法,具体取决于reshape
为您提供memmap
多少开销。
def downSample(a, window):
i, j = a.shape
ir = np.arange(0, i, window)
jr = np.arange(0, j, window)
n = 1./(window**2)
return n * np.add.reduceat(np.add.reduceat(a, ir), jr, axis=1)
没有数据集就很难测试速度。
【讨论】:
【参考方案2】:这避免了中间副本,因为重塑保持尺寸连续
dat_in.reshape((lines/window, window, pixels/window, window)).mean(axis=(1,3))
【讨论】:
以上是关于使用python(numpy memmap,pytables或其他?)对巨大矩阵进行快速下采样的主要内容,如果未能解决你的问题,请参考以下文章
将 CSV 文件加载到 NumPy memmap 数组使用太多内存
python 转储和加载稀疏矩阵https://stackoverflow.com/questions/11129429/storing-numpy-sparse-matrix-in-hdf5-pyt