np.where返回正确结果却触发RuntimeWarning,原因何在?
为啥会出现这个警告?
关键在np.where的运行逻辑
别被掩码迷惑,np.where(condition, x, y)可不是只算掩码覆盖的部分——它会先把x和y对应的整个数组全算完,再根据掩码挑值。
对应到你的代码看
第二次执行a = np.where(bool_2, np.sqrt(a), a)的时候:
- 这时候
a已经变成[1., 4., -3.]了 - 不管
bool_2只选中前两个元素,np.sqrt(a)会先对整个数组计算,也就是硬算sqrt(-3),这在实数数组里属于无效操作,直接触发警告 - 虽然最后第三个元素的无效结果不会被选进最终的
a,但计算过程已经发生,警告拦不住。
怎么解决?
要是不想看到警告,直接针对掩码选中的元素单独处理就行:
a[bool_2] = np.sqrt(a[bool_2])
这样只会给符合bool_2条件的元素开平方,根本碰不到那个负数,自然就没警告了。
内容的提问来源于stack exchange,提问作者Antoine101
相关产品推荐
相关产品推荐

