1

我正在尝试通过使用内存映射数组来处理我的应用程序中的内存问题。但是,作为计算的一部分,我需要将数组中的某些值设置为 0。不幸的是,数组掩码将需要额外的内存。有没有办法做到以下几点,以便干净地处理面具?

source_array = numpy.memmap(filename, dtype='float32', mode='w+', shape=shape)
#Load data into memory mapped numpy array
band.ReadAsArray(buf_obj = source_array)
#set values == 255 to 0
numpy.putmask(source_array, source_array >= 255.0, 0.0)

我相信最后一行source_array >= 255.0必须在内存中创建一个大数组,对吧?除了手动循环遍历每个元素之外,是否有一种内存高效机制可以将我的所有 255 个值设置source_array为 0?

4

1 回答 1

2

抱歉意识到,memapping 掩码当然不是这里的最佳解决方案。Numpy 并没有太多帮助以块的形式循环遍历数组(这将是最干净的方式),尽管您当然可以手动完成。您实际上可能在 numpy 方面取得了一些成功numexpr,它总是以块的形式进行计算以加速 numpy,但我没有尝试过。


我想这不是你想要的:

您始终可以使用ufuncs 的 out 参数和许多其他函数来要求 numpy 将结果直接存储到该数组中(通常也可以节省内存)。这意味着如果您创建一个空的内存映射数组,您可以这样做:

# You could use tempfile.NamedTemporaryFile. But I will leave that to you:
mask = np.memmap(tempfile, shape=source_array.shape, dtype=bool, mode='w+')
np.greater_equal(source_array, 255.0, out=mask)

然后使用mask数组中的putmask. 这应该可以解决问题。

于 2012-10-13T13:14:31.247 回答