2013-06-04 14 views
6

często podczas pracy z numpy rozróżnienie jest denerwujące - kiedy wyciągam wektor lub wiersz z macierzy, a następnie wykonuję operacje z np.array s zazwyczaj występują problemy.numpy np.array kontra np.matrix (wydajność)

Aby zmniejszyć bóle głowy, czasami używałem tylko np.matrix (konwertowanie wszystkich np.arrays na np.matrix) dla uproszczenia. jednak podejrzewam, że są pewne konsekwencje dla wydajności. Czy ktokolwiek może komentować, co to może być i dlaczego?

Wygląda na to, że jeśli obie są tylko tablicami pod maską, dostęp do elementu jest po prostu obliczeniem offsetowym, aby uzyskać wartość, więc nie jestem pewien bez przeczytania całego źródła, jaka może być różnica.

dokładniej, co wydajność oznacza to przede wszystkim:

v = np.matrix([1, 2, 3, 4]) 
# versus the below 
w = np.array([1, 2, 3, 4]) 

dzięki

+1

Duplikat [http://stackoverflow.com/questions/4151128/what-are-the-differences-between-numpy-arrays-and-matrices-which-one-should-iu](http://stackoverflow .com/questions/4151128/what-are-the-differences-between-numpy-array-and-matrices-which-one-should-iu) – jozzas

+1

Tak, ale moje pytanie dotyczy wydajności, o której nie wspomniano w tym poście . Zmienię moje pytanie, aby uczynić ten cel bardziej przejrzystym. – lollercoaster

+2

Wątpię, czy są jakieś znaczące konsekwencje dla wydajności, ale trudno powiedzieć, nie wiedząc dokładnie, co planujesz * robiąc * z obiektem, gdy go utworzysz. Dlaczego nie wykonać niektórych funkcji testowych i spróbować wypróbować 'timeit'? – mgilson

Odpowiedz

3

I dodaje kilka testów, i wydaje się, że jest array jest znacznie szybszy niż matrix, gdy macierz/macierze są małe, ale różnica staje się mniejsza w przypadku większych struktur danych:

Mały:

In [11]: a = [[1,2,3,4],[5,6,7,8]] 

In [12]: aa = np.array(a) 

In [13]: ma = np.matrix(a) 

In [14]: %timeit aa.sum() 
1000000 loops, best of 3: 1.77 us per loop 

In [15]: %timeit ma.sum() 
100000 loops, best of 3: 15.1 us per loop 

In [16]: %timeit np.dot(aa, aa.T) 
1000000 loops, best of 3: 1.72 us per loop 

In [17]: %timeit ma * ma.T 
100000 loops, best of 3: 7.46 us per loop 

Większe:

In [19]: aa = np.arange(10000).reshape(100,100) 

In [20]: ma = np.matrix(aa) 

In [21]: %timeit aa.sum() 
100000 loops, best of 3: 9.18 us per loop 

In [22]: %timeit ma.sum() 
10000 loops, best of 3: 22.9 us per loop 

In [23]: %timeit np.dot(aa, aa.T) 
1000 loops, best of 3: 1.26 ms per loop 

In [24]: %timeit ma * ma.T 
1000 loops, best of 3: 1.24 ms per loop 

Zauważ, że matryce są rzeczywiście nieco szybciej do mnożenia.

Uważam, że to, co tu dostaję, jest zgodne z tym, co wyjaśnia @Jaime.

5

Istnieje ogólna Discusión na SciPy.org i this question.

Aby porównać wydajność, wykonałem następujące czynności w iPythonie. Okazuje się, że tablice są znacznie szybsze.

In [1]: import numpy as np 
In [2]: %%timeit 
    ...: v = np.matrix([1, 2, 3, 4]) 
100000 loops, best of 3: 16.9 us per loop 

In [3]: %%timeit 
    ...: w = np.array([1, 2, 3, 4]) 
100000 loops, best of 3: 7.54 us per loop 

Dlatego też wydaje się, że tablice numpy mają wyższą wydajność niż matryce numpy.

wersje stosowane:

NumPy: 1.7.1

ipython: 0.13.2

Pythonie 2,7