一只魈咸鱼 发表于 2022-1-19 12:06:34

numpy的浮点数放入isinstance(object,float)返回False

傻眼貓咪 发表于 2022-1-19 12:39:13

本帖最后由 傻眼貓咪 于 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

阿奇_o 发表于 2022-1-19 12:49:30

这个好理解呀,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
>>>

一只魈咸鱼 发表于 2022-1-19 15:38:55

阿奇_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:47:17

本帖最后由 阿奇_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 21:05:01

一只魈咸鱼 发表于 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-20 08:51:11

傻眼貓咪 发表于 2022-1-19 21:05
兄弟

1.0 这是 float


ok,tks{:10_250:}

qwb1997 发表于 2022-1-20 09:13:16

{:10_279:}

wp231957 发表于 2022-1-20 10:16:40

傻眼貓咪 发表于 2022-1-19 21:05
兄弟

1.0 这是 float


没有道理啊   整型和浮点型不能比啊

>>> 1==1.0
True
>>> 1==1.0000000000000000000000000000000000000000001
True
>>>

傻眼貓咪 发表于 2022-1-20 12:06:21

wp231957 发表于 2022-1-20 10:16
没有道理啊   整型和浮点型不能比啊

>>> 1==1.0


兄弟,你确定?

对于你给的例子,我想你应该也知道原因

傻眼貓咪 发表于 2022-1-20 12:09:47

1 == 1.001 # False
1==1.0000000000000000000000000000000000000000001 # True

傻眼貓咪 发表于 2022-1-20 12:34:20

傻眼貓咪 发表于 2022-1-20 12:09
1 == 1.001 # False
1==1.0000000000000000000000000000000000000000001 # True

wp231957 发表于 2022-1-20 12:39:09

傻眼貓咪 发表于 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

wp231957 发表于 2022-1-20 12:40:11

傻眼貓咪 发表于 2022-1-20 12:06
兄弟,你确定?

对于你给的例子,我想你应该也知道原因

我手头无法测试c代码
c里 1和1.0也是==吗

傻眼貓咪 发表于 2022-1-20 12:45:54

C 不能这样做

傻眼貓咪 发表于 2022-1-20 13:00:58

其实这题和这没有太大关系,主要是想让楼主明白,不同类型如:<class 'numpy.ndarray'> 和 <class 'float'> 可以做比较。我用 int 和 float 作例子只是为了让楼主明白,其实大家都是程序语言的佼佼者,都知道这样做并不好,毕竟程序语言的设计对于浮点来说根本就是弱鸡。当浮点数尾数达一定程度时,基本精度都会下降,这是一定的。

共同学习~
页: [1]
查看完整版本: numpy的浮点数放入isinstance(object,float)返回False