从具有条件的两个一维数组创建一维数组
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
创建为一维数组(就像 x
和 y
是一维数组一样)并在满足条件时包含 np.sin(x*y)
, 或 0
如果条件未满足,如 def f2d(x,y)
中的要求?
因此,它看起来像是在特定条件下对数组 x
和 y
的一种元素明智的操作。但我不明白为什么它不起作用。我应该先将 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)
我是运行这个程序:
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
创建为一维数组(就像 x
和 y
是一维数组一样)并在满足条件时包含 np.sin(x*y)
, 或 0
如果条件未满足,如 def f2d(x,y)
中的要求?
因此,它看起来像是在特定条件下对数组 x
和 y
的一种元素明智的操作。但我不明白为什么它不起作用。我应该先将 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)