numpy的浮点数放入isinstance(object,float)返回False
本帖最后由 傻眼貓咪 于 2022-1-19 12:45 编辑自己试一下就知道了:import numpy as np
b = np.array(, dtype = 'f')
b = np.squeeze(b)
print(type(b))输出结果:<class 'numpy.ndarray'>
type(b) != float 这个好理解呀,isinstance() 检查的是 实例对象是否属于某个类的实例,该类如果是其父类,也算。
就好比,"你" (作为一个"实例对象") 是个 "人"(这个类),也属于 "动物"(这个"父类")。
看看代码,验证一下:
>>> import numpy as np
>>> b = np.array(, dtype='f')
>>> type(b)
<class 'numpy.ndarray'>
>>> issubclass(type(b), float)
False
>>> type(b)
<class 'numpy.float32'>
>>> issubclass(type(b), float)
False
>>> class myFloat(float):
pass
>>> issubclass(myFloat, float)
True
>>> m = myFloat()
>>> isinstance(m, float)
True
>>> isinstance(b, float)
False
>>> isinstance(b, float)
False
>>>
# 另外,你可以对比 type() == 'xClass'
>>> type(m)
<class '__main__.myFloat'>
>>> type(m) == float
False
>>> type(m) == myFloat
True
>>>
阿奇_o 发表于 2022-1-19 12:49
这个好理解呀,isinstance() 检查的是 实例对象是否属于某个类的实例,该类如果是其父类,也算。
就好比 ...
import numpy as np
>>> a = np.array(,dtype='f')
>>> a
array(, dtype=float32)
>>> a_ = np.squeeze(a)
>>> a_
array(1., dtype=float32)
>>> a_.shape
()
>>> a_ == 1.0
True
这是另一个测试,numpy类型的浮点数可以与1.0比较,既然是数据类型,难道不都是继承了对应的float父类吗,而且shape返回的元祖也很奇怪,numpy数组似乎最少都是(m,)这种的 本帖最后由 阿奇_o 于 2022-1-19 18:48 编辑
一只魈咸鱼 发表于 2022-1-19 15:38
import numpy as np
>>> a = np.array(,dtype='f')
>>> a
你这是"想当然了",想当然地认为 numpy中的"float",是或继承自常规的python的float。但其实不是!我的测试里用issubclass()就是指出和验证这一点。
其次,numpy.ndarray的实例的 dtype属性,是指它里面包含的各个值的类型。
它本身是类似数组的东西;它里面存的某个数值 是类似原float浮点数的东西,但不是一个东西。
我的代码已经很清楚,你看不懂,我也没办法。 一只魈咸鱼 发表于 2022-1-19 15:38
import numpy as np
>>> a = np.array(,dtype='f')
>>> a
兄弟 {:10_247:}{:10_247:}{:10_247:}
1.0 这是 float
1 这是 int
1.0 == 1 是 True
这下你明白了吧 傻眼貓咪 发表于 2022-1-19 21:05
兄弟
1.0 这是 float
ok,tks{:10_250:} {:10_279:} 傻眼貓咪 发表于 2022-1-19 21:05
兄弟
1.0 这是 float
没有道理啊 整型和浮点型不能比啊
>>> 1==1.0
True
>>> 1==1.0000000000000000000000000000000000000000001
True
>>> wp231957 发表于 2022-1-20 10:16
没有道理啊 整型和浮点型不能比啊
>>> 1==1.0
兄弟,你确定?
对于你给的例子,我想你应该也知道原因 1 == 1.001 # False
1==1.0000000000000000000000000000000000000000001 # True 傻眼貓咪 发表于 2022-1-20 12:09
1 == 1.001 # False
1==1.0000000000000000000000000000000000000000001 # True
傻眼貓咪 发表于 2022-1-20 12:34
当14个0时是false 15个0 时就是true
python和js 均是如此
>>> 1==1.000000000000001
False
>>> 1==1.0000000000000001
True
>>>
1==1.000000000000001
false
1==1.0000000000000001
true 傻眼貓咪 发表于 2022-1-20 12:06
兄弟,你确定?
对于你给的例子,我想你应该也知道原因
我手头无法测试c代码
c里 1和1.0也是==吗 C 不能这样做 其实这题和这没有太大关系,主要是想让楼主明白,不同类型如:<class 'numpy.ndarray'> 和 <class 'float'> 可以做比较。我用 int 和 float 作例子只是为了让楼主明白,其实大家都是程序语言的佼佼者,都知道这样做并不好,毕竟程序语言的设计对于浮点来说根本就是弱鸡。当浮点数尾数达一定程度时,基本精度都会下降,这是一定的。
共同学习~
页:
[1]