从具有条件的两个一维数组创建一维数组

Creating 1D array from two 1D arrays with condition

我是运行这个程序:

def f2d(x,y):
    # condition
    if 4*x**2 + y**2 <= 4:
        return np.sin(x*y)
    else:
        return 0

def my_prog(function,n):
    x = np.random.uniform(low=-1, high=+1, size=(n))
    y = np.random.uniform(low=-2, high=+2, size=(n))
    f = function(x,y)
    return (f,n)

(f,n) = my_prog(f2d,5)

我得到这个错误: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

不是很清楚:我不明白如何在我制作的程序中插入a.any()a.all(),我应该在哪里做,为什么...

我的目标只是将 f 创建为一维数组(就像 xy 是一维数组一样)并在满足条件时包含 np.sin(x*y) , 或 0 如果条件未满足,如 def f2d(x,y) 中的要求? 因此,它看起来像是在特定条件下对数组 xy 的一种元素明智的操作。但我不明白为什么它不起作用。我应该先将 f 创建为一个空数组吗?问题出自那里吗?

问题出在# condition下,将运算结果与4进行比较后,会得到一个布尔数组,但是布尔数组无法转换为真值,所以报错,像这样:

>>> np.arange(8) < 5
array([ True,  True,  True,  True,  True, False, False, False])
>>> if np.arange(8) < 5:
...     pass
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

if-clause 期望 truthy-value 但 4*x**2 + y**2 <= 4 是形状 (5,) 布尔数组。要使其正常工作,您应该将其转换为单个 truthy-value 或对其进行迭代,具体取决于您要执行的操作。但是,为了您的任务,您可以根据条件使用 numpy.where 到 select 值。在这种情况下,select 来自 np.sin(x*y) 如果条件满足,否则为 0。

def f2d(x,y):
    # condition
    return np.where(4*x**2 + y**2 <= 4, np.sin(x*y), 0)

测试运行:

>>> my_prog(f2d,5)
(array([0.02896101, 0.34900898, 0.        , 0.        , 0.15721751]), 5)