将numpy数组作为函数参数传递

时间:2018-08-31 15:35:51

标签: python arrays numpy

我想将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'

2 个答案:

答案 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.]