我使用Matplotlib和Numpy来生成一些图。我希望定义一个函数,给定一个数组返回另一个数组,该数组的值按元素方式计算,例如:
def func(x):
return x*10
x = numpy.arrange(-1,1,0.01)
y = func(x)
这很好,但是现在我希望在func
中有一个if语句,例如:
def func(x):
if x<0:
return 0
else:
return x*10
x = numpy.arrange(-1,1,0.01)
y = func(x)
不幸的是,这会引发以下错误
Traceback (most recent call last):
File "D:\Scripts\test.py", line 17, in <module>
y = func(x)
File "D:\Scripts\test.py", line 11, in func
if x<0:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
我看了all()
和any()
的文档,它们不符合我的要求。那么,有没有一种好方法可以让函数像第一个例子那样按元素方式处理数组呢?
6条答案
按热度按时间6tqwzwtp1#
我知道现在回答这个问题已经太晚了,但是我对学习NumPy很感兴趣。您可以使用numpy.where自己对函数进行矢量化。
使用标量作为数据输入:
使用数组作为数据输入:
1)如果
x
是掩码数组,则需要使用np.ma.where
,因为这适用于掩码数组。mqxuamgl2#
在将func应用于数组
x
之前,使用numpy.vectorize
将其 Package :u4vypkhs3#
这应该可以满足您的需要:
invert
是一个Numpy函数。注意,这会修改参数。要防止这种情况,您必须修改并返回x
的copy
。d7v8vwbk4#
还有一个选项在这里没有提到--使用
np.choose
。虽然可读性不强,但这只是一个表达式(不是一系列语句),并没有降低numpy固有的速度(如
np.vectorize
)。shyt4zoc5#
mask
是一个布尔数组,它等于True
是数组索引,匹配条件,False
在其他地方。最后一行用乘以10的值替换原始数组中的所有值。编辑以反映比约恩的相关评论
xkrw2x1b6#
不确定为什么需要函数