我能做一个numpy内存映射掩模吗?

2024-10-16 20:43:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过使用内存映射数组来处理应用程序中的内存问题。但是,作为计算的一部分,我需要将数组中的一些值设置为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?在


Tags: 内存numpy应用程序sourcemode数组filenamearray
1条回答
网友
1楼 · 发布于 2024-10-16 20:43:47

抱歉,我意识到,当然memmapping-mask并不是一个最佳的解决方案。Numpy实际上并没有太多帮助以块的形式循环数组(这将是最干净的方式),尽管您当然可以手动执行。实际上,使用numexpr可能会取得一些成功,它总是分块计算以加速numpy,但我没有尝试过。在


我想这不是你想要的:

您总是可以使用out参数来ufuncs和许多其他函数来要求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)

然后在putmask中使用mask数组。这应该能解决问题。在

相关问题 更多 >