我想将numpy数组arr
传递给what_a_function
并打印结果数组,这应该不使用循环来完成。我知道这很丑陋且不友好,但我必须这样做。我尝试了vectorize
,但一直失败。有人可以分享一些建议吗?谢谢!
import numpy as np
def what_a_function(x):
return -np.cos(x.all()) * (0.5 < np.sin(x) < 2) + (np.sin(x) <= 0.5) + (x ** 2) * (np.sin(x) >= 2)
a=1
b=5
vfunc = np.vectorize(what_a_function)
arr = np.arange(a,b+0.1,0.1)
print(arr)
print(vfunc(arr))
它会抱怨AttributeError: 'float' object has no attribute 'all'
。
答案 0 :(得分:1)
那种“超级丑陋和不友好”的方程式没有任何意义。应该评估哪种x
值?
-np.cos(x.all()) * (0.5 < np.sin(x) < 2) + (np.sin(x) <= 0.5) + (x ** 2) * (np.sin(x) >= 2)
x.all()
需要一个数组(使用all
方法),并返回一个布尔值(标量或数组),这是np.cos
的无用输入。
np.sin(x)
可以用于标量或数组,但是0.5<...<2
仅适用于标量(Python不适用于numpy)。
下一个np.sin(x)<=.5
将产生一个布尔值(标量或数组)。 x**2
将是一个数字值。
+
和*
会完成一些工作,将布尔值True / False转换为1/0整数。但是逻辑运算符更好。
如果我们知道应该做什么,我们可能可以将其编写为直接与数字数组一起使用。 np.vectorize
不能替代编写适当的数组兼容代码。正如我所评论的,vectorize
将数组值作为标量一一传递给函数。这就是all
方法产生错误(并且没有意义)的原因。最重要的是vectorize
很慢。
直接理解列表的速度更快:
np.array([your_function(i) for i in x])
答案 1 :(得分:0)
函数all()以list作为其参数。 我对代码进行了微小的更改。希望对您有所帮助!
import numpy as np
def what_a_function(x):
return all([-np.cos(x)]) * (0.5 < np.sin(x) < 2) + (np.sin(x) <= 0.5) + (x ** 2) * (np.sin(x) >= 2)
a=1
b=5
vfunc = np.vectorize(what_a_function)
arr = np.arange(a, b+0.1, 0.1)
print(arr)
print(vfunc(arr))
Output:[1. 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2. 2.1 2.2 2.3 2.4 2.5 2.6 2.7
2.8 2.9 3. 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4. 4.1 4.2 4.3 4.4 4.5
4.6 4.7 4.8 4.9 5. ]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]