加速NumPy中的代码

时间:2014-01-16 06:26:22

标签: numpy scipy

我有两维numpy数组(raster_data),光栅大小为100万* 100万。 我想将该栅格分为两类,如下所示:

class_A = np.where((raster_data >= 5.23) & (raster_data < 8.55),raster_data,np.nan)
class_B = np.where((raster_data >= 8.55) & (raster_data < 10.0),raster_data,np.nan)

但是,由于数据量极大,我收到内存错误。 我怎样才能按照我的意愿对该栅格进行分类? 我已经尝试过使用16GB RAM和64位NumPy。

3 个答案:

答案 0 :(得分:3)

您可以尝试布尔索引和就地操作来节省内存:

>>> class_A = raster_data.copy()
>>> class_B = raster_data.copy()
>>> mask = raster_data < 5.23
>>> mask |= raster_data >= 8.55
>>> class_A[mask] = np.nan
>>> mask = raster_data < 8.55
>>> mask |= raster_data >= 10
>>> class_B[mask] = np.nan

答案 1 :(得分:3)

这是你如何用pytables做的。虽然我希望你有耐心并且有很多空间。

import tables as tb
import numpy as np
import time

f = tb.openFile('humongusFile.h5', 'w')

n = 100000
x = f.createCArray(f.root, 'x', tb.Float16Atom(), (n,n), filters=tb.Filters(5, 'blosc'))



t0 = time.time()

for i in range(n):
    x[i] = np.random.random_sample(n)* 10
x.flush()  # dump data to disk

t1 = time.time()
print t1 - t0
print "Done creating test data"

y1 = f.createCArray(f.root, 'y1', tb.Float16Atom(), (n,n), filters=tb.Filters(5, 'blosc'))
y2 = f.createCArray(f.root, 'y2', tb.Float16Atom(), (n,n), filters=tb.Filters(5, 'blosc'))

t2 = time.time()
print t2 - t1
print "Done creating output array"

expr = tb.Expr("where((x >= 5.23) & (x < 8.55), x, 0)")
expr.setOutput(y1)

expr2 = tb.Expr("where((x >= 5.23) & (x < 8.55), x, 0)")
expr2.setOutput(y2)

t3 = time.time()
print t3 - t2
print "Starting evaluating first output"
expr.eval()
print "Starting evaluating second output"
expr2.eval()
print "Done"
t4 = time.time()
print t4 - t3

答案 2 :(得分:0)

如果您的数据集确实像您指定的那样庞大,那么您将需要某种形式的磁盘存储和核外计算。

这完全取决于你想要用这个面具做什么,但看看pytables;它允许有效存储和操纵这种大型阵列。