NDArray的一些性质

运算的内存开销

前⾯例⼦⾥我们对每个操作新开内存来储存它的结果。例如即使是 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()

猜你喜欢

转载自blog.csdn.net/love_wanling/article/details/81130136
今日推荐