在NumPy中执行按元素操作时,添加条件语句的最佳方法是什么?

时间:2019-10-24 14:35:43

标签: python arrays performance numpy

我有一个正整数列表,我想从所有元素中重复减去最小的元素,但前提是该元素不是最小值的实例。例如,一次迭代

a = np.array([3, 5, 9, 3, 3])变成[3, 2, 6, 3, 3],最终变成[1,1,1,1,1]

也就是说,没有条目会减少为0。我怀疑可能存在一种简单的方法来修改a - min(a),使得a[0]a[3]和{{1} }不会变成0,但我不知道。

我知道可以通过列表理解来实现:

a[4]

尽管数组可能非常大,所以考虑到时间效率,我希望NumPy有一个方便的方法可以做到这一点。我对Python还是很陌生,因此赞赏所有能力的校正/信息。

1 个答案:

答案 0 :(得分:1)

这可以使用where函数的3句变体来处理:

>>> import numpy as np
>>> a = np.array([3, 5, 9, 3, 3])
>>> m = a.min()
>>> np.where(a != m, a - m, m)
array([3, 2, 6, 3, 3])

并将其包装在while循环中。

除了使用set,您还可以使用numpy.unique

while len(np.unique(a)) > 1:
    m = a.min()
    a = np.where(a != m, a - m, m)

但是您应该分别计时两个变量(setunique,列表理解与where),以查看哪种方法对大型数组最快。

另一种方法是比较最大值和最小值:也许a.max()的计算速度比np.unique快:

while True:
    m = a.min()
    if m == a.max():
        break
    a = np.where(a != m, a - m, m)