Python 为什么Tensorflow不覆盖张量的等式?

Python 为什么Tensorflow不覆盖张量的等式?,python,numpy,tensorflow,Python,Numpy,Tensorflow,Tensorflow覆盖了Tensor类等的多个运算符 但是,\uuu eq\uu的实现: ops.Tensor.\u override\u运算符(“\u lt\u”,gen\u math\u ops.less) 运算张量,运算量,运算量,运算量,运算量,运算量,运算量 运算张量覆盖运算器(“uu gt_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 运算张量,运算量,运算量,运算量,运算量,运算量,运算

Tensorflow覆盖了Tensor类等的多个运算符

但是,
\uuu eq\uu
的实现:

ops.Tensor.\u override\u运算符(“\u lt\u”,gen\u math\u ops.less)
运算张量,运算量,运算量,运算量,运算量,运算量,运算量
运算张量覆盖运算器(“uu gt_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
运算张量,运算量,运算量,运算量,运算量,运算量,运算量,运算量,运算量,运算量,运算量
为什么tensorflow的张量的
==
与numpy数组的行为方式不同

代码示例:

a = tf.constant([1,2])
b = tf.constant([3,4])
a == b
>>> False
a < b
>>> <tf.Tensor 'Less:0' shape=(2,) dtype=bool>
张量确实实现了
\uuuuueq\uuuuu
,但是。我发现,这解释了为什么张量测试身份,而不广播:

这可能是一个复杂的事实,即张量可以用作字典中的键,我相信它使用
=
来查找具有相同哈希的匹配对象

评论者是正确的;如果
\uuuu eq\uuuu
被重载为广播,则不能将张量用作字典中的键。定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;见:

唯一需要的属性是比较相等的对象具有相同的哈希值

但广播将为具有不同散列值的对象生成“真”张量对象

(关于
\uuuu eq\uuuu
会破坏布尔测试的推测是错误的;布尔测试使用的是张量,张量确实实现了这一点)


如果您需要对张量进行元素相等性测试,可以使用and函数。

您是否认为
\uuuuu eq\uuuu
不是仅在这些行上定义的?因为我看到,例如,
将tensorflow导入为tf
,然后vars(tf.Tensor)
中的
\uuueq\uuuuuuuuuuuuuuuuu>生成
True
,因此它定义了钩子。它是定义的。@MartijnPieters不,我的观察是基于我的代码,没有做我期望它做的事情。这些链接是经过一些挖掘后产生的。另外,我知道张量相等的定义。但是,它不符合
numpy
阵列。我希望添加的代码澄清了这个问题。为什么在测试相等性时要广播张量?该项目明确决定改为测试身份;我发现了一个github问题,这就解释了为什么。@musicaly\u ut:嗯,
\u eq\u
被明确定义为身份测试。哇!在
提要中使用张量作为键的设计决策导致
\uuuu eq\uuuuu
的定义方式与
tf.张量的
numpy
的定义方式不同!看起来不是这么直截了当的。例如,tf.constant([0])==tf.constant([0])是至少在tf2中包含[True]的tf.Tensor。看起来执行力很强
a = np.asarray([1,2])
b = np.asarray([3, 4])
a == b
>>> array([False, False], dtype=bool)