NDArray的一些性质

这篇博客探讨了NDArray在运算过程中的内存开销,指出即使在y = x + y这样的操作中也会产生新的内存。通过id函数可以验证这一点。为了避免额外的内存开销,可以使用zeros_like创建新的NDArray并利用索引进行替换操作,或者利用全名函数的out参数。此外,讲解了NDArray的复制特性,普通的赋值操作如y = x会导致y成为x的别名,共享数据存储,而使用copy方法可以实现真正意义上的复制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运算的内存开销

前⾯例⼦⾥我们对每个操作新开内存来储存它的结果。例如即使是 y = x + y 我们也会新创建
内存,然后再将 y 指向新内存。为了展⽰这⼀点,我们可以使⽤ Python ⾃带的 id 函数:如果两
个实例的 ID ⼀致,那么它们所对应的内存地址相同;反之则不同。

In [24]: before = id(y)
         y = y + x
         id(y) == before
Out[24]: False

如果我们想指定结果到特定内存,我们可以使⽤前⾯介绍的索引来进替换操作。在下⾯的例⼦中,
我们先通过 zeros_like 创建和 y 形状相同且元素为 0 的 NDArray,记为 z。接下来,我们把 x
+ y 的结果通过 [:] 写进 z 所对应的内存中。

In [25]: z = y.zeros_like()
         before = id(z)
         z[:] = x + y
         id(z) == before
Out[25]: True

注意到这⾥我们还是为 x + y 创建了临时内存来存储计算结果,再复制到 z 所对应的内存。如
果想避免这个内存开销,我们可以使⽤运算符的全名函数中的 out 参数。

In [26]: nd.elemwise_add(x, y, out=z)
            id(z) == before
Out[26]: True

如果现有的 NDArray 的值在之后的程序中不会复⽤,我们也可以⽤ x[:] = x + y 或者 x +=
y 来减少运算的内存开销。

复制

a = nd.arange(4)
b = a
b[1] = 33
a
[ 0. 33.  2.  3.]

所以,在NDArray中一般的赋值语句像y = x,y实际上只是x的一个别名而已,x和y是共享一份数据存储空间的。如果要不一样,得用copy

y = x.copy()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值