gpt4 book ai didi

python - 调整 numpy.memmap 数组的大小

转载 作者:IT老高 更新时间:2023-10-28 20:34:44 25 4
gpt4 key购买 nike

我正在处理一堆大型 numpy 数组,由于最近这些数组开始占用太多内存,我想用 numpy.memmap 实例替换它们。问题是,有时我必须调整数组的大小,我最好就地这样做。这对普通数组非常有效,但在 memmaps 上尝试会提示数据可能是共享的,甚至禁用 refcheck 也无济于事。

a = np.arange(10)
a.resize(20)
a
>>> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

a = np.memmap('bla.bin', dtype=int)
a
>>> memmap([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

a.resize(20, refcheck=False)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-41-f1546111a7a1> in <module>()
----> 1 a.resize(20, refcheck=False)

ValueError: cannot resize this array: it does not own its data

调整底层 mmap 缓冲区的大小可以正常工作。问题是如何将这些更改反射(reflect)到数组对象中。我看过这个workaround ,但不幸的是,它不会适本地调整数组的大小。还有一些numpy documentation关于调整 mmap 的大小,但它显然不起作用,至少在 1.8.0 版中是这样。任何其他想法,如何覆盖内置的调整大小检查?

最佳答案

问题在于,当您创建数组时,标志 OWNDATA 为 False。您可以通过在创建数组时要求标志为 True 来更改它:

>>> a = np.require(np.memmap('bla.bin', dtype=int), requirements=['O'])
>>> a.shape
(10,)
>>> a.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
>>> a.resize(20, refcheck=False)
>>> a.shape
(20,)

唯一需要注意的是,它可能会创建数组并制作副本以确保满足要求。

编辑以保存地址:

如果要将调整大小的数组保存到磁盘,可以将 memmap 保存为 .npy 格式的文件,并在需要重新打开时以 numpy.memmap 的形式打开,用作memmap:

>>> a[9] = 1
>>> np.save('bla.npy',a)
>>> b = np.lib.format.open_memmap('bla.npy', dtype=int, mode='r+')
>>> b
memmap([0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

编辑以提供另一种方法:

您可以通过调整基本 mmap(a.base 或 a._mmap,以 uint8 格式存储)的大小并“重新加载”memmap 来接近您正在寻找的内容:

>>> a = np.memmap('bla.bin', dtype=int)
>>> a
memmap([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
>>> a[3] = 7
>>> a
memmap([0, 0, 0, 7, 0, 0, 0, 0, 0, 0])
>>> a.flush()
>>> a = np.memmap('bla.bin', dtype=int)
>>> a
memmap([0, 0, 0, 7, 0, 0, 0, 0, 0, 0])
>>> a.base.resize(20*8)
>>> a.flush()
>>> a = np.memmap('bla.bin', dtype=int)
>>> a
memmap([0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

关于python - 调整 numpy.memmap 数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20932361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com