我在使用numpy.average时遇到了麻烦,每次都会遇到错误,直到我将输入转换为numpy.float64s。我查看了源代码,这是因为以下行为,差异的原因是什么?
>>> f, f32 = numpy.float(1.0), numpy.float32(1.0)
>>> (f == 1.0).any()
Traceback (most recent call last):
File "<pyshell#80>", line 1, in <module>
(f == 1.0).any()
AttributeError: 'bool' object has no attribute 'any'
>>> (f32 == 1.0).any()
True
答案 0 :(得分:2)
>>> type(numpy.float32(1.0))
<type 'numpy.float32'>
>>> type(numpy.float(1.0))
<type 'float'>
>>> type(numpy.float32(1.0) == 1.0)
<type 'numpy.bool_'>
>>> type(numpy.float(1.0) == 1.0)
<type 'bool'>
numpy.float32
和numpy.bool_
不仅用于存储标量,还用于存储矢量:
>>> numpy.float32([1.0, 2.0])
array([ 1., 2.], dtype=float32)
>>> numpy.float32([1.0, 2.0]) == 1.0
array([ True, False], dtype=bool)
因此any()
中有一个numpy.bool_
函数来检查是否有任何项目为真。
答案 1 :(得分:1)
这是因为numpy.float32
对象在与bool
进行比较时没有返回__eq__
个对象,而是numpy.bool_
个对象。
>>> type((f == 1.0))
<type 'bool'>
>>> type((f32 == 1.0))
<type 'numpy.bool_'>
答案 2 :(得分:0)
您通常不需要使用numpy.float(1.0)
等表达式。
numpy
中最常见的基本操作是创建数组。
f = np.array([1.0, 1.23])
mf = f.mean() # or
mf = np.mean(f)
或整数
f = np.array([1, 3, 5, 3, 5])
f==3
(f==3).any()
注意我使用==
测试的整数。使用浮动时,==
测试不是一个好主意。
我可以进一步指定dtype
:
f = np.arange(5, dtype=int)
f = np.ones((3,4), dtype=float)
这些数组的各个项目的类型为np.float
,np.int
等。很少需要直接创建np.float(1.23)
。创建数组时指定dtype
,否则让numpy
处理这些细节。