Numpy: эффективный способ найти индекс элемента в массиве с наименьшим значением из заданного массива индекса - PullRequest
0 голосов
/ 28 февраля 2019

Скажем, у меня есть массив NumPy a = np.array([1, 5, 3, 2, 4, 6, 7]).Теперь у меня есть еще один массив NumPy b = np.array([-1, -2, 3, 2, -1, -3]).Длина b меньше или равна a.Я хочу найти индекс i наименьшего элемента в a такой, что b[i] > 0.Таким образом, в приведенном выше примере результат будет 3, поскольку согласно b действительны только индексы 2, 3 и a[2] == 3 и a[3] == 2, поэтому выбран индекс 3.

Myтекущее решение -

    smallest = np.inf
    index = None
    for i in range(len(b)):
        if b[i] > 0:
            if(a[i] < smallest):
                smallest = a[i]
                index = i

Я не уверен, смогу ли я использовать numpy, чтобы сделать это более эффективно.Любой совет приветствуется.Спасибо.

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Вы можете использовать промежуточные результаты индексов из b, чтобы получить правильный индекс позже, вот способ.

import numpy as np
a = np.array([1, 5, 3, 2, 4, 6, 7])
b = np.array([-1, -2, 3, 2, -1, -3])

indices_to_check = np.where(b > 0)[0]
result = indices_to_check[np.argmin(a[indices_to_check])]
#Output:
3
0 голосов
/ 28 февраля 2019

один вкладыш:

idx = np.argwhere(a==a[:len(b)][b>0].min())[0]

Понятный код:

shortened_a = a[:len(b)]
filtered_a = shortened_a[b>0]
smallest = filtered_a.min()
indices_of_smallest = np.argwhere(a==smallest)
first_idx = indices_of_smallest[0]
0 голосов
/ 28 февраля 2019

Вот один векторизованный способ -

In [72]: idx = np.flatnonzero(b>0)

In [73]: idx[a[:len(b)][idx].argmin()]
Out[73]: 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...