鱼C论坛

 找回密码
 立即注册
查看: 1369|回复: 15

[已解决]numpy的浮点数放入isinstance(object,float)返回False

[复制链接]
发表于 2022-1-19 12:06:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Screenshot 2022-01-19 120615.png
最佳答案
2022-1-19 18:47:17
本帖最后由 阿奇_o 于 2022-1-19 18:48 编辑
一只魈咸鱼 发表于 2022-1-19 15:38
import numpy as np
>>> a = np.array([1],dtype='f')
>>> a


你这是"想当然了",想当然地认为 numpy中的"float",是或继承自  常规的python的float。但其实不是!我的测试里用issubclass()就是指出和验证这一点。
其次,numpy.ndarray的实例的 dtype属性,是指它里面包含的各个值的类型。
它本身是类似数组的东西;它里面存的某个数值 是类似原float浮点数的东西,但不是一个东西。

我的代码已经很清楚,你看不懂,我也没办法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-19 12:39:13 From FishC Mobile | 显示全部楼层
本帖最后由 傻眼貓咪 于 2022-1-19 12:45 编辑

自己试一下就知道了:
import numpy as np

b = np.array([1], dtype = 'f')
b = np.squeeze(b)
print(type(b))
输出结果:
<class 'numpy.ndarray'>

type(b) != float
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-19 12:49:30 | 显示全部楼层
这个好理解呀,isinstance() 检查的是 实例对象是否属于某个类的实例,该类如果是其父类,也算。
就好比,"你" (作为一个"实例对象") 是个 "人"(这个类),也属于 "动物"(这个"父类")。

看看代码,验证一下:
>>> import numpy as np
>>> b = np.array([1], dtype='f')
>>> type(b)
<class 'numpy.ndarray'>
>>> issubclass(type(b), float)
False
>>> type(b[0])
<class 'numpy.float32'>
>>> issubclass(type(b[0]), float)
False
>>> class myFloat(float):
        pass

>>> issubclass(myFloat, float)
True
>>> m = myFloat()
>>> isinstance(m, float)
True
>>> isinstance(b, float)
False
>>> isinstance(b[0], float)
False
>>> 
# 另外,你可以对比 type() == 'xClass'
>>> type(m)
<class '__main__.myFloat'>
>>> type(m) == float
False
>>> type(m) == myFloat
True
>>> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-19 15:38:55 | 显示全部楼层
阿奇_o 发表于 2022-1-19 12:49
这个好理解呀,isinstance() 检查的是 实例对象是否属于某个类的实例,该类如果是其父类,也算。
就好比 ...

import numpy as np
>>> a = np.array([1],dtype='f')
>>> a
array([1.], dtype=float32)
>>> a_ = np.squeeze(a)
>>> a_
array(1., dtype=float32)
>>> a_.shape
()
>>> a_ == 1.0
True

这是另一个测试,numpy类型的浮点数可以与1.0比较,既然是数据类型,难道不都是继承了对应的float父类吗,而且shape返回的元祖也很奇怪,numpy数组似乎最少都是(m,)这种的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-19 18:47:17 | 显示全部楼层    本楼为最佳答案   
本帖最后由 阿奇_o 于 2022-1-19 18:48 编辑
一只魈咸鱼 发表于 2022-1-19 15:38
import numpy as np
>>> a = np.array([1],dtype='f')
>>> a


你这是"想当然了",想当然地认为 numpy中的"float",是或继承自  常规的python的float。但其实不是!我的测试里用issubclass()就是指出和验证这一点。
其次,numpy.ndarray的实例的 dtype属性,是指它里面包含的各个值的类型。
它本身是类似数组的东西;它里面存的某个数值 是类似原float浮点数的东西,但不是一个东西。

我的代码已经很清楚,你看不懂,我也没办法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-19 21:05:01 | 显示全部楼层
一只魈咸鱼 发表于 2022-1-19 15:38
import numpy as np
>>> a = np.array([1],dtype='f')
>>> a

兄弟

1.0 这是 float
1 这是 int

1.0 == 1 是 True

这下你明白了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-20 08:51:11 | 显示全部楼层

ok,tks
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-20 09:13:16 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-20 10:16:40 | 显示全部楼层

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

>>> 1==1.0
True
>>> 1==1.0000000000000000000000000000000000000000001
True
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-20 12:06:21 From FishC Mobile | 显示全部楼层
wp231957 发表于 2022-1-20 10:16
没有道理啊   整型和浮点型不能比啊

>>> 1==1.0


兄弟,你确定?

对于你给的例子,我想你应该也知道原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-20 12:09:47 From FishC Mobile | 显示全部楼层
1 == 1.001 # False
1==1.0000000000000000000000000000000000000000001 # True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-20 12:34:20 From FishC Mobile | 显示全部楼层
傻眼貓咪 发表于 2022-1-20 12:09
1 == 1.001 # False
1==1.0000000000000000000000000000000000000000001 # True

AE12693E-30D9-4DD7-AAB8-D91A93BAE725.jpeg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-20 12:39:09 | 显示全部楼层

当14个0时  是false 15个0 时  就是true
python和js 均是如此

>>> 1==1.000000000000001
False
>>> 1==1.0000000000000001
True
>>>

1==1.000000000000001
false
1==1.0000000000000001
true
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-20 12:40:11 | 显示全部楼层
傻眼貓咪 发表于 2022-1-20 12:06
兄弟,你确定?

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

我手头无法测试c代码
c里 1和1.0  也是==  吗  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-20 12:45:54 From FishC Mobile | 显示全部楼层
C 不能这样做
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

共同学习~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 09:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表