Numpy:传入函数的np.array上的布尔运算



Numpy允许将numpy.array作为参数传递到函数中,并为数组的每个元素计算函数。:

def f(n):
return n**2
arr = np.array([1,2,3])
f(arr)

输出:

>>>[1 4 9]

只要f(n)不对n执行如下布尔运算,这就可以正常工作:

def f(n):
if n%2 == 0:
print(n)

上面的代码引发以下异常:ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

这是有道理的,因为调试器显示函数f(n)接收了整个numpy.array作为输入。现在,我正在寻找一种改变代码行为的方法,这样我就可以对输入执行布尔运算。在传递整个numpy.array时,这可能吗?或者我必须通过手动迭代数组的每个元素来调用函数吗?

---编辑:---

def get_far_field_directivity(k,a,theta):
temp = k*a*np.sin(theta)
if temp == 0: return 1
else: return (2*sp.jn(1,(temp)))/(temp)

该函数返回到其他函数,这些函数必须在进一步计算时使用其值,这就是@Chrysophylaxs的索引方法不起作用的原因。

你想试试这样的东西吗?https://numpy.org/doc/stable/reference/generated/numpy.vectorize.html

import numpy as np
arr = np.array([1,2,3])
def f(n):
if n%2 == 0:
print(n)
return n**2
vfunc = np.vectorize(f)      
vfunc(arr)          

输出:

2
array([1, 4, 9])

而这个

f(arr)     

输出:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

您的第二个输入np.array([1, 2, 3, 4, 5]):的示例

  • 执行第一个n%2,它返回np.array([1, 0, 1, 0, 1]),这是按元素的模2
  • 接下来,将得到的数组与0进行元素比较,得到:np.array([False, True, False, True, False])
  • 最后,在if语句中检查该数组的真实性。这就是问题发生的地方,因为数组包含多个元素,numpy不能确定您想要的是True还是False

我怀疑您希望打印输入数组中模2等于0的所有值。如果是这样的话,你可以通过使用布尔数组进行索引来过滤掉它们

def f(n):
evens = n[ n%2 == 0 ]
print(evens)
Input:   f(np.array([1, 2, 3, 4, 5]))
Output:  array([2, 4])

最新更新