如何仅对某些数组元素应用函数?

5 投票
3 回答
2838 浏览
提问于 2025-04-17 18:27

我有一个数组 x,我想对每个符合某个条件的元素应用一个函数 f。Numpy 有没有什么简单的方法来做到这一点呢?

举个例子,我的数组 x 应该只包含在 (0, 1) 这个范围内的元素。但是,由于四舍五入的误差,有些元素可能会等于 01。对于每个等于 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 的元素。你可以用这个做很多事情,具体可以参考这个链接

撰写回答