我有一个关于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
我们使用这些(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
或任一数组的操作,而不必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
这是将数组的内存设置为另一个数组视图的正确方法吗?
是否有统一数组内存的显而易见的方法,我公然缺失?
我不知道x
和y
的旧数据缓冲区会发生什么情况,因为它们现在已超出范围。他们会被释放吗?
更新感谢@Jaime:
p.size
可以得到非常大(数十亿)数据集上我申请(微生物)。另外,这个主题被用于具有可能较深结构的框架中,因此更新所有本地版本可能会变得昂贵。所有参数的更新都需要在优化循环中完成,因此将所有内容都放在内存中至关重要。
其实你的方法是我从一开始,因为它是低效的使用python层次遍历来更新所有本地副本。
你为什么不干脆让自己的两个数组的副本? 'p = np.concatenate((a,b)); local_a = p [:len(a)]; local_b = p [len(a):]'如果您需要'a'和'b'来反映您对本地版本所做的更改,请使用'a [:] = local_a完成您的操作。 b [:] = local_b'。 – Jaime