如何将函数应用于仅特定的数组元素?

5
我有一个数组x,想对符合某些条件的矩阵中的每个项应用函数f。 Numpy是否提供了使此过程变得容易的机制?
这里有一个例子。 我的矩阵x只应包含排除范围内的元素(0,1)。 但是,由于舍入误差,有些元素可以等于01。 对于x中每个恰好是0的元素,我希望添加epsilon,并且对于每个恰好是1的元素,我希望减去epsilon编辑:(在接受askewchan的答案之后进行了此编辑。)另一种方法是使用numpy.clip
3个回答

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的元素。您可以使用此功能进行许多操作,请参见http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html


1
没问题。我已经修复了,将epsilon调整为微小值(1e-5),而不是巨大值(1e5)。 - askewchan

3
抱歉,这不是更具体的解释,但是您可以创建一个布尔数组,每个满足条件的位置都有一个TRUE值,没有则为FALSE。
例如,在测试1时,像[0, 1, 0, 0]会得到一个数组[FALSE, TRUE, FALSE, FALSE]。此时,您可以执行[0, 1, 0, 0] - (epsilon)[FALSE, TRUE, FALSE, FALSE]并保留0的值不变。
Boolean Array Example: https://dev59.com/ZWkv5IYBdhLWcg3wiRWo

2

4
NumPy数组的优势之一是它不使用Python循环,因为如果列表非常长,循环速度会很慢。 - askewchan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接