我似乎偶然发现了一些奇怪的代码行为,并且不确定这是预期的还是错误的。当我添加从时间对象派生的int时,对int64的类型检查失败。
我可以将其范围缩小为字面量到时间对象的乘积:
import numpy, time
# base check works
ts = numpy.arange(10, dtype=numpy.int64)
print(type(ts[0]), " and should be numpy.int64 : ", end = "")
if isinstance(ts[0], numpy.int64) : print("Check OK!")
else : print("Check FAILED!")
# time object works
ts = numpy.arange(10, dtype=numpy.int64) + int(round(time.time()))
print(type(ts[0]), " and should be numpy.int64 : ", end = "")
if isinstance(ts[0], numpy.int64) : print("Check OK!")
else : print("Check FAILED!")
# float itself works
ts = numpy.arange(10, dtype=numpy.int64) + numpy.int64(round(1e9))
print(type(ts[0]), " and should be numpy.int64 : ", end = "")
if isinstance(ts[0], numpy.int64) : print("Check OK!")
else : print("Check FAILED!")
# for some reason the multiplication of both does not work
ts = numpy.arange(10, dtype=numpy.int64) + int(round(time.time()*1e9))
print(type(ts[0]), " and should be numpy.int64 : ", end = "")
if isinstance(ts[0], numpy.int64) : print("Check OK!")
else : print("Check FAILED!")
我的输出是:
<class 'numpy.int64'> and should be numpy.int64 : Check OK!
<class 'numpy.int64'> and should be numpy.int64 : Check OK!
<class 'numpy.int64'> and should be numpy.int64 : Check OK!
<class 'numpy.int64'> and should be numpy.int64 : Check FAILED!
上面的第一个检查工作都是应做的,因为据我了解,ts的dtype应该保持int64(而且确实如此)。
但是最后一次检查失败,即使dtype表示为int64。我不明白为什么。
我使用numpy1.16.4在python3.6.8上运行了代码。机器是64位的,因此自然int也应该是64位的,但是无论哪种方式都没有关系,因为我在numpy数组(AFAIK)中特别声明了int64。
我实际上有3台不同的机器,具有不同的python版本(python 3.5.3和numpy 1.16.2)和(3.6.8和1.16.2)产生相同的失败检查。其中一个甚至不是我自己设置的,而是一个托管系统。我相信这与我的本地安装无关。