【问题标题】:Edit existing .npy file imported using memmap编辑使用 memmap 导入的现有 .npy 文件
【发布时间】:2018-02-09 21:32:21
【问题描述】:

我是使用 numpy.core.memmap 对象的新手,并且无法弄清楚如何使用 numpy.memmap() 编辑现有的 .npy 文件读入 python。例如,按照 Scipy.org 的示例,我可以创建一个对象并写入它,但是一旦创建,我就无法修改其内容。

from tempfile import mkdtemp
import os.path as path

data = np.arange(12, dtype='float32')
data.resize((3,4))

filename = path.join(mkdtemp(), 'newfile.dat')
fp = np.memmap(filename, dtype='float32', mode='w+', shape=(3,4))
fp[:] = data[:] ### write data to fp array

del fp ### remove fp object

fpc = np.memmap(filename, dtype='float32', mode='c', shape=(3,4)) ### This is writeable in memory

fpc[0,:] = 0

del fpc ### close object

这只是从内存中删除对象,但文件名处的对象没有被修改。我也尝试过 numpy.memmap.flush(fpc)​​ ,但这似乎也不起作用。

我从阅读其他帖子中了解到,可以简​​单地将编辑后的 ​​.npy 文件复制到另一个位置,但这似乎在磁盘空间方面可能会出现问题。您不能修改现有的 .npy 文件是否正确?

【问题讨论】:

  • mode='c' 是写时复制模式,它只将更改写入内存,从不写入磁盘。尝试使用mode='r+'。 ('r+'实际上是根据docs的默认值)
  • 好吧,现在我觉得自己很愚蠢。如果你把它写成答案,我会接受的。

标签: python numpy-memmap


【解决方案1】:

Numpy 将“写入时复制”解释为 “将更改写入 ram,但不要将它们保存到磁盘” (docs)。当提到可以在线程或进程之间共享的数据时,这是一个相当标准的实现。听起来您将写时复制与snapshots 混淆了(有时使用类似的术语,但指的是磁盘写入而不是内存)。

如果您将mode="c" 更改为mode="r+"(或删除mode 关键字,因为“r+”是默认值),这应该可以解决您的问题。

另外我想指出的是,在大多数情况下,使用np.savenp.load 并在加载文件时使用正确的模式简单地指定mmap_mode 关键字会更简单和更pythonic。虽然在技术上限制了灵活性,但这消除了指定几个关键字的需要,使事情更加简洁。

【讨论】:

    猜你喜欢
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多