2014-05-14 92 views
4

我有一个关于numpys存储视图的问题: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 

我们使用这些(xy)在一个框架中,这样我们不能重新定义它们,因为用户可能已经为自己链接了它们(如在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或任一数组的操作,而不必redifine每一个参考他们

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):]'如果您需要'a'和'b'来反映您对本地版本所做的更改,请使用'a [:] = local_a完成您的操作。 b [:] = local_b'。 – Jaime

回答