【问题标题】:While doing element-wise operations in NumPy, what's the best way to add a conditional statement?在 NumPy 中进行元素操作时,添加条件语句的最佳方法是什么?
【发布时间】:2019-10-24 14:35:43
【问题描述】:

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

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]a[4] 不会变为 0,但是我不知道。

我知道这可以通过列表理解来完成:

while len(set(arr)) > 1:

arr = [a - min(arr) if a > min(arr) else a for a in arr]

虽然数组可能非常大,所以考虑到时间效率,我希望 NumPy 有一种方便的方法来做到这一点。我对 Python 还是很陌生,因此感谢所有能力的更正/信息。

【问题讨论】:

  • 我相信最终的结果会是一个充满原始数组的GCD的数组。

标签: python arrays performance numpy


【解决方案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)

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 2022-01-18
    • 2015-04-09
    • 2020-12-08
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 2013-02-10
    相关资源
    最近更新 更多