gpt4 book ai didi

python - Numpy 设置数组内存

转载 作者:太空宇宙 更新时间:2023-11-03 11:04:34 31 4
gpt4 key购买 nike

我有一个关于 numpys 内存 View 的问题:

假设我们有两个带内存的数组:

import numpy as np
import gc
x = np.arange(4*3).reshape(4,3).astype(float)
y = (np.arange(5) - 5).astype(float)
y_ref = y

我们在框架中使用这些 (x, y),这样我们就不能重新定义它们,因为用户可能已经为自己链接了它们(如 y_ref)。现在我们想将他们的内存合并到一个 View 中。因此,单个 View ,比如说 p 与两个数组共享内存。

我是按照下面的方式做的,不知道会不会导致内存泄露:

p = np.empty(x.size+y.size, dtype=float) # create new memory block with right size
c = 0 # current point in memory

# x
p[c:c+x.size].flat = x.flat # set the memory for combined array p
x.data = p[c:c+x.size].data # now set the buffer of x to be the right length buffer of p

c += x.size

# y
p[c:c+y.size].flat = y.flat # set the memory for combined array p
y.data = p[c:c+y.size].data # and set the buffer of x to be the right length buffer of p

因此,我们现在可以对单个 View p 或任一数组进行操作,而无需重新定义对它们的每个引用

x[3] = 10
print p[3*3:4*3]
# [ 10. 10. 10.]

甚至 y_ref 也有更新:

print y[0] # -5
y_ref[0] = 100
print p[x.size] # 100

这是将一个数组的内存设置为另一个数组的 View 的正确方法吗?

是否有一种明显的方法来统一数组的内存,我公然错过了?

我不确定 xy 的旧数据缓冲区会发生什么,因为它们现在超出了范围。他们会被释放吗?

更新感谢@Jaime:

p.size 在我应用的数据集(微生物学)上可能会变得非常大(达到数十亿)。此外,此主题在具有潜在深层结构的框架中使用,因此更新所有本地版本可能会很昂贵。所有参数的更新都需要在优化循环中完成,因此将所有内容都保存在内存中至关重要。

实际上,您的方法正是我最初采用的方法,因为使用 python 层次结构遍历更新所有本地副本效率低下。

最佳答案

根据源代码,旧数据缓冲区将被释放。

https://github.com/numpy/numpy/blob/6c6ddaf62e0556919a57d510e13ccb2e6cd6e043/numpy/core/src/multiarray/getset.c#L329

但是如果旧缓冲区被其他数组引用,就会出现问题:

import numpy as np

a = np.zeros(10)
b = np.zeros(10)
c = a[:]
a.data = b
print c

关于python - Numpy 设置数组内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23650796/

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