2013-06-04 48 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 .com/questions/4151128/what-are-the-differences-between-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.orgthis question一般discusion。

爲了比較性能,我在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