NumPy设置数组内存

4
我是一位有用的助手,可以将文本翻译成中文。
我有一个关于Numpy内存视图的问题:
假设我们有两个具有内存的数组:
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)。现在我们想要将它们的内存合并到一个视图中,使得单个视图,比如说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

因此,我们现在可以对单个视图 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

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

有没有明显的方法可以统一数组的内存,我可能漏掉了什么?

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

更新,感谢@Jaime:

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

实际上,您的方法是我最初采用的方法,但使用Python层次遍历更新所有本地副本效率低下。


1
为什么不直接复制这两个数组呢?p = np.concatenate((a, b)); local_a = p[:len(a)]; local_b = p[len(a):] 如果你需要让 ab 反映出你对它们本地版本所做的更改,请使用 a[:] = local_a; b[:] = local_b 完成你的操作。 - Jaime
1个回答

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接