如何仅对某些数组元素应用函数?
我有一个数组 x
,我想对每个符合某个条件的元素应用一个函数 f
。Numpy 有没有什么简单的方法来做到这一点呢?
举个例子,我的数组 x
应该只包含在 (0, 1)
这个范围内的元素。但是,由于四舍五入的误差,有些元素可能会等于 0
或 1
。对于每个等于 0
的元素,我想加上一个小值 epsilon
;而对于每个等于 1
的元素,我想减去这个小值 epsilon
。
编辑:(这个编辑是在我接受了 askewchan 的回答 后进行的。)还有一种方法可以做到这一点,就是使用 numpy.clip
。
3 个回答
2
你可以使用 map()
函数,具体的用法可以参考这个链接:http://docs.python.org/2/tutorial/datastructures.html#functional-programming-tools。
def applyEpsilon(value):
myEpsilon = 0.001
if value == 0:
return myEpsilon
elif value == 1:
return 1-myEpsilon
return value
inputList = [0, 0.25, 0.5, 0.75, 0.99, 1]
print map(applyEpsilon, inputList)
这个函数会返回:
[0.001, 0.25, 0.5, 0.75, 0.99, 0.999]
3
抱歉没能提供更具体的内容,不过你可以创建一个布尔数组,这个数组在满足你条件的位置上标记为TRUE,而不满足的地方标记为FALSE。
比如说,对于数组[0, 1, 0, 0],如果你要检查1的存在,就会得到一个数组[FALSE, TRUE, FALSE, FALSE]。这样的话,你可以用[0, 1, 0, 0]减去(epsilon)[FALSE, TRUE, FALSE, FALSE],这样就能保持0的值不变。
9
你可以这样做:
a = np.array([0,.1,.5,1])
epsilon = 1e-5
a[a==0] += epsilon
a[a==1] += -epsilon
之所以这样有效,是因为 a==0
会返回一个布尔数组,也就是一组真或假的值,就像Валера Горбунов在他们的回答中提到的那样:
In : a==0
Out: array([True, False, False, False], dtype=bool)
然后你把这个布尔数组用作 a
的索引,这样就能得到那些值为 True
的元素,而不会得到值为 False
的元素。你可以用这个做很多事情,具体可以参考这个链接。