Z NUMPY, jaki jest najszybszy sposób na wygenerowanie tablicy z -N do N, z wyłączeniem 0, będąc {x0}} Intereger?

Podąża za jednym rozwiązaniem, ale nie jestem pewien, że jest to najszybszy:

n = 100000
np.concatenate((np.arange(-n, 0), np.arange(1, n+1)))
0
gmagno 1 marzec 2019, 07:23

2 odpowiedzi

Najlepsza odpowiedź

Alternatywnym podejściem jest utworzenie zakresu -N do N-1. Następnie dodaj 1 do elementów z zera.

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)

Myślę, że zmniejszony czas reakcji jest spowodowany tworzeniem tylko jednej tablicy, nie trzy jak w podejściu Concatenate.

3
Stuxen 1 marzec 2019, 14:10

Edytować

Dziękuję wszystkim. Edytowałem mój post i zaktualizowałem nowy czas testu.

Ciekawy problem.

Eksperyment

Zrobiłem to w moim Jupsyter-Notebook. Wszystkie używane numpy API. Możesz samodzielnie przeprowadzić eksperyment następującego kodu.

O czasie pomiaru w Jupsyter-Notebook, zobacz: Proste Sposób na pomiar czasu wykonania komórek w Notebooku IPython

Oryginalny 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. Lista Rozumienie + 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)

Wniosek

Nie ma dużej różnicy między oryginałem a rozwiązaniem 1, ale rozwiązanie 2 jest najgorsze wśród trzech. Szukam też szybszych rozwiązań.

Odniesienie

Dla tych, którzy są:

Zainteresuje się inicjalizacją i wypełnieniem maila

Uzyskaj zdezorientowany is vs ==

1
WY Hsu 1 marzec 2019, 14:10