Как вычесть наименьшее большее значение в другом отсортированном массиве для каждого элемента в одном отсортированном массиве - PullRequest
3 голосов
/ 04 мая 2019

Допустим, у нас есть два отсортированных числовых массива a и b.

a = np.array([ 0,  1,  2, 10])
b = np.array([ 7, 13])

Для каждого массива элементов a я хочу вычесть первый больший элемент в b, чтобыполучить что-то вроде этого:

>>> f(a, b)
array([-7, -6, -5, -3])

Я могу сделать это с помощью неэффективного цикла for, но есть ли более тупой способ сделать это?

Ответы [ 3 ]

4 голосов
/ 04 мая 2019

Вы можете использовать для этого searchsorted.Для этого потребуется, чтобы b был отсортирован, а a не имел значений больше, чем самое большое в b.

> a = np.array([0, 1, 2, 10, 12, 5, 7])
> b = np.array([7, 13])
> a - b[np.searchsorted(b, a, side='right')]

array([-7, -6, -5, -3, -1, -2, -6])
0 голосов
/ 04 мая 2019

Вам следует попробовать это решение, даже если оно не является встроенной функцией, поскольку оно гораздо более гибкое. (работает во всех ситуациях):

def subtract(a, b):
    final = []
    if b.__len__() != 0 and a.__len__() != 0:
        biggest = b[0]
        for j in range(b.__len__()):
            if b[j] < biggest:
                biggest = b[j]
            print(b[j])
        print(biggest)
        for i in range(a.__len__()):
            if a[i] > biggest:
                final.insert(final.__len__(), biggest-a[i])
            else:
                final.insert(final.__len__(), a[i]-biggest)
    return final
0 голосов
/ 04 мая 2019

Название и пояснения противоречивы.

Предполагая, что вы ищете первый элемент b, который больше, а не маленький из b, который больше, тогда это будет сделано:

a - b[np.argmax(a[:,None]<b,axis=1)]

# array([-7, -6, -5, -3])

Если вам нужен наименьший , который больше, вы можете отсортировать b заранее, используя b = np.sort(b), но тогда использование searchsorted (), предложенное Марком Мейером, будет более эффективным.

обратите внимание, что в b должен быть хотя бы один элемент, который больше, чем самый большой элемент в a

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...