2013-06-04 2 views
6

часто при работе с numpy. Я нахожу различие раздражающим - когда я вытягиваю вектор или строку из матрицы, а затем выполняю операции с np.array, обычно возникают проблемы.numpy np.array versus np.matrix (производительность)

для уменьшения головных болей, я иногда использовал только np.matrix (преобразование всех np.arrays в np.matrix) просто для простоты. однако, я подозреваю, что есть некоторые последствия для производительности. может ли кто-нибудь прокомментировать, что это может быть и почему?

Кажется, что если они оба представляют собой массивы под капотом, доступ к элементу - это просто расчет смещения, чтобы получить значение, поэтому я не уверен, не прочитав весь источник, какая разница.

более конкретно, какие последствия производительности делает это имеет:

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

благодаря

+1

Дубликат [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-difference-between-numpy-arrays-and-matrices-which-one-should-iu) – jozzas

+1

да, но мой вопрос касается производительности, о которой не упоминается в этом сообщении , Я отредактирую свой вопрос, чтобы сделать этот фокус более понятным. – lollercoaster

+2

Я сомневаюсь, что есть существенные последствия для производительности, но это трудно сказать, не зная точно, что вы планируете * делать * с объектом после его создания. Почему бы не сделать некоторые тестовые функции и не попробовать 'timeit'? – mgilson

ответ

3

Я добавил еще несколько тестов, и это, кажется, что array значительно быстрее, чем matrix, когда массивы/матрицы малы, но для больших структур данных разница становится меньше:

Small:

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 

Larger:

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 

Обратите внимание, что матрицы на самом деле немного быстрее для умножения.

Я считаю, что то, что я получаю здесь, согласуется с тем, что @Jaime объясняет комментарий.

5

Существует общий дискурс на SciPy.org и this question.

Чтобы сравнить производительность, я сделал следующее в iPython. Оказывается, массивы значительно быстрее.

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 

Следовательно, массивы numpy обладают более высокой производительностью, чем матрицы numpy.

Версии, используемые:

Numpy: 1.7.1

IPython: 0.13.2

Python: 2,7

Смежные вопросы