# Using Python state
x = tf.zeros([10, 10])
x += 2 # This is equivalent to x = x + 2, which does not mutate the original
# value of x
print(x)
x从0更改为2。 它显示x = tf.zeros([10,10])的以下结果:
<tf.Tensor: id=266, shape=(10, 10), dtype=float32, numpy=
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32)>
然后在执行后更改为以下内容:x + = 2
<tf.Tensor: id=263, shape=(10, 10), dtype=float32, numpy=
array([[2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2., 2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2., 2., 2., 2., 2., 2.]], dtype=float32)>
注释为什么说“不会改变x的原始值”?
答案 0 :(得分:1)
克里斯·希尔德(Chris Heald)是对的。最容易看到使用NumPy的区别:
import numpy as np
a = np.array(2)
b = a # Set up an alias
a += 1 # NumPy operations are in-place - they mutate the array
print(b) # Output: 3!
由于ndarray
的{{1}}就地改变了数组,因此对该数组的任何引用都将更新,因此代码将打印__iadd__
。在这方面,NumPy数组更像对象。
将此与不可变的TF 3
(代码为TF 2)进行比较:
Tensor
输出2,因为import tensorflow as tf
a = tf.constant(2)
b = a # Set up an alias
a += 1 # Tensor operations are not in-place - a new tensor is created
print(b) # Output: 2
是不可变的。因此它们更像原始值。
访问原始值非常简单-只需将其分配给其他变量(就像我对Tensor
所做的那样)。
另一种描述方法是使用列表:
b = a