使用python(numpy memmap,pytables或其他?)快速下采样巨大矩阵

时间:2017-05-18 08:40:49

标签: python numpy downsampling data-formats bigdata

作为我的数据处理的一部分,我生成了大约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包。

在创建如此庞大的矩阵(此处未显示)之前,我还考虑过对数据进行下采样,但是我的输入数据是断裂的和不规则的,因此会变得非常复杂。

2 个答案:

答案 0 :(得分:1)

基于this answer,我认为这可能是一种相对较快的方法,具体取决于reshapememmap带来的开销{。}}。

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)

没有您的数据集很难测试速度。

答案 1 :(得分:0)

这避免了中间副本,因为重塑保持尺寸连续

dat_in.reshape((lines/window, window, pixels/window, window)).mean(axis=(1,3))