这里发生了什么事情?
我们突然得到了一个看起来是包含浮点数
>>> 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'
我们突然得到了一个看起来是包含浮点数
1.0
的 字符串!?>>> a = np.uint64(1)
>>> type(a%2)
<type 'numpy.float64'>
尽管实际上只是一个浮点数,但背后的哲学是什么?
我理解numpy想要在类型和类型规则等方面比基本Python更加严格,以使效率更高,但在这种情况下,将一个非常意外的结果返回给用户(很可能破坏他们的程序)的缺点似乎远远超过了在走下这条泥泞的道路之前检查模数符号所需的轻微成本增加。
在使用uint64
值的情况并不罕见。例如,如果您将图像加载到numpy int数组中然后对其进行求和,则会得到uint64
。另一方面,几乎不可能对负数取模(除了为了看看会发生什么,我从未这样做过),因为通常对可以计数的事物进行取模,例如索引,而不同的语言/标准/库可以各自拥有其自己的结果想法。
所有这些结合在一起让我感到相当困惑。
numpy.float64
,但是却没有字符串,奇怪... (3.5-np=1.14.0 and 2.7-np=1.14.3) - Julien