2013-06-04 5 views
6

numpyで作業しているときに、私は区別がわかります。行列からベクトルまたは行を取り出してnp.arrayで操作すると、通常は問題があります。numpy np.arrayと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-differences-numpy-arrays-and-matrices-which-one-should-iu) – jozzas

+1

はい、しかし、私の質問は性能に関するものです。 。その焦点をより明確にするために質問を編集します。 – lollercoaster

+2

重要なパフォーマンスの影響があるのではないかと疑いますが、作成したオブジェクトを使って*行うことを計画していることを正確に知らなければ、言うことは難しいです。なぜ、いくつかのテスト関数を作り、 'timeit'を試してみてはどうですか? – mgilson

答えて

3

私はいくつかのより多くのテストを追加し、それが表示されますarray配列/行列が小さい場合には、matrixよりもかなり高速ですが、大きなデータ構造ではその差は小さくなります。

小:

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 

大きな:行列が乗算に若干速い実際に

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