С помощью numpy, какой самый быстрый способ создать массив из -n в n, исключая 0, будучи `n` целым числом? - PullRequest
0 голосов
/ 01 марта 2019

С numpy, какой самый быстрый способ создать массив от -n до n, исключая 0, будучи n целым числом?

Придерживается одного решения, но я не уверен, что это самый быстрый:

n = 100000
np.concatenate((np.arange(-n, 0), np.arange(1, n+1)))

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Альтернативный подход заключается в создании диапазона от -n до n-1.Затем добавьте 1 к элементам с нуля.

def non_zero_range(n):
    # The 2nd argument to np.arange is exclusive so it should be n and not n-1
    a=np.arange(-n,n)
    a[n:]+=1
    return a

n=1000000
%timeit np.concatenate((np.arange(-n,0), np.arange(1,n+1)))
# 4.28 ms ± 9.46 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit non_zero_range(n)
# 2.84 ms ± 13.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Я думаю, что уменьшенное время отклика связано с созданием только одного массива, а не трех, как в методе объединения.

0 голосов
/ 01 марта 2019

Редактировать

Спасибо всем.Я отредактировал свой пост и обновил новое время тестирования.

Интересная проблема.

Эксперимент

Я сделал это в своем блокноте Jupyter-Notebook.Все они использовали numpy API.Вы можете провести эксперимент следующего кода самостоятельно.

Об измерении времени в блокноте jupyter см. Простой способ измерения времени выполнения ячейки в блокноте ipython

Оригинал np.concatenate

%%timeit 
n = 100000
t = np.concatenate((np.arange(-n, 0), np.arange(1, n+1)))

#175 µs ± 2.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Sol 1. np.delete

%%timeit 
n = 100000
a = np.arange(-n, n+1)
b = np.delete(a, n)

# 179 µs ± 5.66 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Sol 2. Понимание списка + np.arrary

%%timeit
c = np.array([x for x in range(-n, n+1) if x != 0])

# 16.6 ms ± 693 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

Заключение

Нет большой разницы между оригиналом и решением1, но решение 2 является худшим из трех.Я также ищу более быстрые решения.

Справка

Для тех, кто:

заинтересован в инициализации и заполнении массива numpy

запутаться в is против ==

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