【发布时间】:2020-10-20 00:48:12
【问题描述】:
我已阅读 this question 并了解 Numpy 数组不能在布尔上下文中使用。假设我想对函数输入的有效性执行逐元素布尔检查。我可以在仍然使用 Numpy 矢量化的同时实现这种行为吗?如果可以,如何实现? (如果不是,为什么?)
在以下示例中,我从两个输入计算一个值,同时检查两个输入是否有效(都必须大于 0)
import math, numpy
def calculate(input_1, input_2):
if input_1 < 0 or input_2 < 0:
return 0
return math.sqrt(input_1) + math.sqrt(input_2)
calculate_many = (lambda x: calculate(x, 20 - x))(np.arange(-20, 40))
由于ValueError,这本身不适用于 Numpy 数组。但是,绝对不要在负输入上运行 math.sqrt,因为这会导致另一个错误。
使用列表推导的一种解决方案如下:
calculate_many = [calculate(x, 20 - x) for x in np.arange(-20, 40)]/=
但是,这不再使用矢量化,并且如果 arange 的大小急剧增加,将会非常缓慢。
有没有办法在仍然使用矢量化的同时实现这个if 检查?
【问题讨论】:
-
math.sqrt仅适用于标量,因此您的calculate,即使没有if,也不适用于整个数组 - 即。没有“矢量化”。有一个np.sqrt可以与整个数组一起使用。它接受where参数来控制评估哪些值(与out参数一起使用)。 -
可选的
where是类数组是什么意思?这是否意味着如果我想对input_1中的所有正数进行平方根并将所有其他输出条目保留为未定义,我会写np.sqrt(input_1, input_1 > 0)? -
^上面运行时不起作用,但我不知道怎么写,文档没有解释。