numpy.subtract但仅在差异达到阈值之前 - 将数字替换为小于阈值的数字

时间:2014-08-25 20:02:46

标签: python arrays optimization numpy

我想从numpy数组中的每个元素中减去给定值。 例如,如果我有一个名为a_q的numpy数组和名为subtract_me的变量,那么我可以这样做:

result = np.subtract(a_q,subtract_me)

没关系。但是我不希望它只是盲目地从每个元素中减去。如果差异低于阈值,那么我不希望减法发生。相反,我希望数组的元素被该阈值替换。

最有效的方法是什么?我可以简单地遍历数组并从每个元素中减去并检查是否已达到阈值,并从结果中构建一个新数组(如下所示) - 但是有更好或更有效的方法做到了吗?

threshold = 3 # in my real program, the threshold is the 
              # lowest non-infinity number that python can handle
subtract_me = 6
a_q = []
for i in range(10):
    val = i - subtract_me
    if val < threshold:
        val = threshold
    a_q.append(val)

myarr = np.array(a_q)
print myarr

1 个答案:

答案 0 :(得分:1)

对于NumPy数组,矢量化方法通常效率最高,所以这里的一种方法可能比一次迭代数组一个元素更有效:

>>> threshold = 3
>>> subtract_me = 6
>>> a_q = np.arange(10)

>>> arr = a_q - subtract_me # takeaway the subtract_me value
array([-6, -5, -4, -3, -2, -1,  0,  1,  2,  3])

>>> arr[arr - subtract_me < threshold] = threshold # replace any value less than threshold
array([3, 3, 3, 3, 3, 3, 3, 3, 3, 3])

编辑:由于np.clip在问题下面的评论中被提及,我可能会将其吸收到我的答案中以便完整; - )

以下是您可以使用它来获得所需结果的一种方式:

>>> np.clip((a_q - subtract_me), threshold, np.max(a_q))
array([3, 3, 3, 3, 3, 3, 3, 3, 3, 3])