我正在尝试使用内存映射数组来处理应用程序中的内存问题。但是,作为我计算的一部分,我需要将数组中的某些值设置为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
的最后一行必须在内存中创建一个大数组,对吧?除了手动循环遍历每个元素外,还有一种内存有效的机制可以将source_array
中的所有255个值设置为0吗?
答案 0 :(得分:2)
很抱歉意识到当然重新映射掩码并不是最佳解决方案。 Numpy并没有太大帮助以块的形式循环遍历数组(这将是最干净的方式),尽管你当然可以手工完成。实际上你可能在numexpr
取得了一些成功,它总是用块来计算加速numpy,但我没试过。
我想这不是你想要的:
您总是可以使用out参数ufunc
和许多其他函数来让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
数组。这应该可以解决问题。