奇怪的numpy行为,这里发生了什么?

时间:2015-12-14 03:27:28

标签: python numpy

我在使用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

3 个答案:

答案 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.float32numpy.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.floatnp.int等。很少需要直接创建np.float(1.23)。创建数组时指定dtype,否则让numpy处理这些细节。