问题描述
给出以下代码:
def to_l(pos_probs,threshold):
return (pos_probs >= threshold).astype('int')
thresh = np.arange(0,0.2,0.1)
print(thresh)
这有效:
print([to_l([0.2,0.3],w) for w in thresh])
结果:
[0. 0.1]
[array([1,1]),array([1,1])]
但这不是:
[to_l([0.2,w) for w in [0.,0.1]]
这不是:
to_l([0.2,0.1)
给出错误:
TypeError: '>=' not supported between instances of 'list' and 'float'
在第二和第三种情况下,类型错误很明显。我们正在将列表[0.2,0.3]与浮点数0.1进行比较。
但是有人会解释为什么它在第一种情况下有效吗?
解决方法
这称为numpy支持的广播。因此,当操作中的两个操作数具有不同的形状时,numpy将尝试广播它并执行操作。
-
[0.2,0.3] >= 0
将不起作用,因为此处不涉及numpy。您将收到错误:
TypeError: '>=' not supported between instances of 'list' and 'float'
-
np.array([1,2,3]) > 2
可以使numpy广播成为现实。 -
[1,3] > np.float32(2)
也可以使用
但是,
-
[1,3] > np.float(2)
将不起作用,因为np.float
只是pythonfloat
的别名。但是np.float32
和np.float64
分别是单精度和双精度数字的np实现。