在numpy中,如果我有一个浮点数组,动态创建一个布尔掩码,该数组等于一个特定值,并使用布尔数组进行按位AND,我得到一个错误:
>>> import numpy as np
>>> a = np.array([1.0, 2.0, 3.0])
>>> a == 2.0 & b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ufunc 'bitwise_and' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe'
如果我将比较结果保存到变量并执行按位AND,则可行:
>>> c = a == 2.0
>>> c & b
array([False, True, False], dtype=bool)
在每种情况下创建的对象看起来都相同:
>>> type(a == 2.0)
<type 'numpy.ndarray'>
>>> (a == 2.0).dtype
dtype('bool')
>>> type(c)
<type 'numpy.ndarray'>
>>> c.dtype
dtype('bool')
为什么会有差异?
答案 0 :(得分:6)
&
的{{3}}高于==
,因此表达式
a == 2.0 & b
与
相同a == (2.0 & b)
您收到错误,因为没有为浮点标量和布尔数组定义按位and
。
添加括号以获得预期效果:
(a == 2.0) & b