编辑使用 memmap 导入的现有 .npy 文件
Edit existing .npy file imported using memmap
我是使用 numpy.core.memmap 对象的新手,我无法弄清楚如何使用 numpy.memmap() 编辑读入 python 的现有 .npy 文件。例如,按照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 文件复制到另一个位置,但这似乎在磁盘方面可能会出现问题 space。您不能修改现有的 .npy 文件是否正确?
Numpy 将 "copy on write" 解释为 "write changes to ram, but don't save them to disk"(docs). This is a fairly standard implementation when referring to data that could be shared between threads or processes. It sounds like you confused copy on write with snapshots(有时使用类似的术语,但指的是磁盘写入而不是内存) .
如果您将 mode="c"
更改为 mode="r+"
(或删除 mode
关键字,因为 "r+" 是默认关键字),这应该可以解决您的问题。
此外,我想指出的是,在大多数情况下,使用 np.save
and np.load
并在加载文件时使用正确的模式指定 mmap_mode
关键字更简单,更符合 pythonic。虽然在技术上限制了灵活性,但这消除了指定几个关键字的需要,使事情更加简洁。
我是使用 numpy.core.memmap 对象的新手,我无法弄清楚如何使用 numpy.memmap() 编辑读入 python 的现有 .npy 文件。例如,按照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 文件复制到另一个位置,但这似乎在磁盘方面可能会出现问题 space。您不能修改现有的 .npy 文件是否正确?
Numpy 将 "copy on write" 解释为 "write changes to ram, but don't save them to disk"(docs). This is a fairly standard implementation when referring to data that could be shared between threads or processes. It sounds like you confused copy on write with snapshots(有时使用类似的术语,但指的是磁盘写入而不是内存) .
如果您将 mode="c"
更改为 mode="r+"
(或删除 mode
关键字,因为 "r+" 是默认关键字),这应该可以解决您的问题。
此外,我想指出的是,在大多数情况下,使用 np.save
and np.load
并在加载文件时使用正确的模式指定 mmap_mode
关键字更简单,更符合 pythonic。虽然在技术上限制了灵活性,但这消除了指定几个关键字的需要,使事情更加简洁。