Более эффективный способ обрезки значений в массивах? - PullRequest
0 голосов
/ 09 мая 2020

У меня есть следующий код:

import numpy as np

MIN = -3
MAX = 3

def bound(array):
    return np.array([(0 if v == 0 else (MIN if v < 0 else 1)) for v in array]),\
           np.array([(0 if v == 0 else (-1 if v < 0 else MAX)) for v in array])

print(bound(np.array(range(MIN, MAX + 1))))

, который возвращает:

(array([-3, -3, -3,  0,  1,  1,  1]), array([-1, -1, -1,  0,  3,  3,  3]))

Мой фактический массив намного больше, чем этот, но состоит из целых чисел от MIN до MAX ( в данном случае от -3 до 3).

MIN и MAX не должны считаться симметричными c с 0, но значения 0 должны поддерживаться.

Есть ли более эффективный / быстрый (время процессора) способ сделать то же самое? Мы очень ценим сравнение времени.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Использование np. где

def bound_where(array):
  return np.where(array==0, 0, np.where(array<0, MIN, 1)), \
           np.where(array==0, 0, np.where(array<0, -1, MAX))

Сравнение с другими методами

Тест

Методы

  1. Размещенный метод
  2. Выбрать метод (bound2 из ответа @QuangHoang)
  3. Где Метод (текущий ответ)

Тестовый код

arr = np.random.randint(-10,10,1000)
count = 1000
print(f'Posted method: {timeit(lambda:bound(arr), number=count):.4f}')
print(f'Select method: {timeit(lambda:bound2(arr), number=count):.4f}')
print(f'Where mehtod: {timeit(lambda:bound_where(arr), number=count):.4f}')

Результаты (секунды)

Posted method: 6.1951
Select method: 0.3959
Where method: 0.1466

Где метод самый быстрый в целом

0 голосов
/ 09 мая 2020

Я бы использовал np.select:

def bound2(arr):
    pos_neg = arr>0, arr<0
    return (
        np.select(pos_neg, (1,MIN),0),
        np.select(pos_neg, (MAX,-1),0)
    )

Время теста:

# sample data
arr = np.random.randint(-10,10,1000)

%%timeit -n 100
bound(arr)
# 858 µs ± 28.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit -n 100
bound2(arr)
# 59.9 µs ± 4.45 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...