鱼C论坛

 找回密码
 立即注册
查看: 1579|回复: 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浮点数的东西,但不是一个东西。

我的代码已经很清楚,你看不懂,我也没办法。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

  2. b = np.array([1], dtype = 'f')
  3. b = np.squeeze(b)
  4. print(type(b))
复制代码
输出结果:
  1. <class 'numpy.ndarray'>
复制代码

type(b) != float
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

看看代码,验证一下:
  1. >>> import numpy as np
  2. >>> b = np.array([1], dtype='f')
  3. >>> type(b)
  4. <class 'numpy.ndarray'>
  5. >>> issubclass(type(b), float)
  6. False
  7. >>> type(b[0])
  8. <class 'numpy.float32'>
  9. >>> issubclass(type(b[0]), float)
  10. False
  11. >>> class myFloat(float):
  12.         pass

  13. >>> issubclass(myFloat, float)
  14. True
  15. >>> m = myFloat()
  16. >>> isinstance(m, float)
  17. True
  18. >>> isinstance(b, float)
  19. False
  20. >>> isinstance(b[0], float)
  21. False
  22. >>>
  23. # 另外,你可以对比 type() == 'xClass'
  24. >>> type(m)
  25. <class '__main__.myFloat'>
  26. >>> type(m) == float
  27. False
  28. >>> type(m) == myFloat
  29. True
  30. >>>
复制代码
小甲鱼最新课程 -> https://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,)这种的
小甲鱼最新课程 -> https://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浮点数的东西,但不是一个东西。

我的代码已经很清楚,你看不懂,我也没办法。
小甲鱼最新课程 -> https://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

这下你明白了吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

ok,tks
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-20 09:13:16 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

>>> 1==1.0
True
>>> 1==1.0000000000000000000000000000000000000000001
True
>>>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

>>> 1==1.0


兄弟,你确定?

对于你给的例子,我想你应该也知道原因
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-20 12:09:47 From FishC Mobile | 显示全部楼层
1 == 1.001 # False
1==1.0000000000000000000000000000000000000000001 # True
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

我手头无法测试c代码
c里 1和1.0  也是==  吗  
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-20 12:45:54 From FishC Mobile | 显示全部楼层
C 不能这样做
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

共同学习~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 12:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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