这里发生了什么?
>>> a = np.int8(1)
>>> a%2
1
>>> a = np.uint8(1)
>>> a%2
1
>>> a = np.int32(1)
>>> a%2
1
>>> a = np.uint32(1)
>>> a%2
1
>>> a = np.int64(1)
>>> a%2
1
>>> a = np.uint64(1)
>>> a%2
'1.0'
我们突然得到一个包含 float 1.0
的字符串!?
>>> a = np.uint64(1)
>>> type(a%2)
<type 'numpy.float64'>
......虽然事实证明它只是一个漂浮物。
这背后的哲学是什么?
我知道numpy想要更严格地处理类型和打字规则之类的事情,以便比基本的python更有效,但在这种情况下,向用户返回一个非常意外的结果(可能会打破他们的程序)的缺点似乎远远超过在沿着这条湿滑路径徘徊之前检查模数符号的成本略有增加。
使用uint64
值并不是很少见。例如,如果您将图像加载到numpy int数组中然后对其求和,则需要uint64
(s)。另一方面,用负数来修改任何东西是非常罕见的(除了看看会发生什么之外,我从来没有做过),因为你通常会修改你可以计算的东西,比如索引,以及不同的语言/标准/库每个人都可以对结果应该有自己的想法。
所有这些让我感到困惑。