При выполнении поэлементных операций в NumPy, каков наилучший способ добавить условный оператор? - PullRequest
0 голосов
/ 24 октября 2019

У меня есть список натуральных чисел, и я хочу многократно вычитать наименьший элемент из всех элементов, но только если этот элемент не является экземпляром минимума. Например, за одну итерацию

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, поэтому ценится исправление / информация во всех сферах.

1 Ответ

1 голос
/ 24 октября 2019

Это может быть выполнено с использованием варианта с 3 пунктами функции where:

>>> 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)

Но вы должны рассчитать оба варианта (set против unique, составление списка по сравнению с where) по отдельности, чтобы увидеть, что работает быстрее для больших массивов.

Другой вариант - сравнить максимум и минимум: возможно, a.max() можно вычислить быстрее, чем np.unique:

while True:
    m = a.min()
    if m == a.max():
        break
    a = np.where(a != m, a - m, m)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...