2013-06-04 41 views
6

thường khi làm việc với numpy tôi thấy sự phân biệt gây phiền nhiễu - khi tôi lấy ra một véc tơ hoặc một hàng từ ma trận và sau đó thực hiện các thao tác với np.array s thường có vấn đề.nump.array so với np.matrix (hiệu suất)

để giảm đau đầu, đôi khi tôi chỉ sử dụng np.matrix (chuyển đổi tất cả np.arrays thành np.matrix) chỉ để đơn giản. tuy nhiên, tôi nghi ngờ có một số hàm ý hiệu suất. bất cứ ai có thể bình luận như những gì những người có thể được và lý do tại sao?

có vẻ như cả hai chỉ là mảng bên dưới mui xe mà truy cập phần tử đơn giản là phép tính bù trừ để nhận giá trị, vì vậy tôi không chắc chắn nếu không đọc toàn bộ nguồn có thể khác biệt.

đặc biệt hơn, những gì tác động hiệu suất thực hiện điều này có:

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

nhờ

+1

Bản sao của [http://stackoverflow.com/questions/4151128/what-are-the-differences-between-numpy-arrays-and-matrices-which-one-should-iu](http://stackoverflow .com/question/4151128/what-are-the-different-giữa-numpy-arrays-and-matrix-which-one-should-iu) – jozzas

+1

có, nhưng câu hỏi của tôi là về hiệu suất, không được đề cập trong bài đăng đó . Tôi sẽ chỉnh sửa câu hỏi của mình để làm cho tiêu điểm đó rõ ràng hơn. – lollercoaster

+2

Tôi nghi ngờ rằng có bất kỳ ý nghĩa hiệu suất đáng kể, nhưng nó là loại khó để nói mà không biết chính xác những gì bạn đang lập kế hoạch * làm * với đối tượng khi bạn tạo ra nó. Tại sao không thực hiện một số chức năng kiểm tra và thử 'timeit'? – mgilson

Trả lời

3

tôi đã thêm một số xét nghiệm hơn, và có vẻ như một array nhanh hơn đáng kể so với matrix khi mảng/ma trận nhỏ, nhưng sự khác biệt sẽ nhỏ hơn đối với cấu trúc dữ liệu lớn hơn:

nhỏ:

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 

Chú ý rằng ma trận thực sự nhanh hơn một chút cho phép nhân.

Tôi tin rằng những gì tôi nhận được ở đây phù hợp với những gì @Jaime đang giải thích nhận xét.

5

Có một discusion chung về SciPy.org và trên this question.

Để so sánh hiệu suất, tôi đã làm như sau trong iPython. Nó chỉ ra rằng mảng là nhanh hơn đáng kể.

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 

Do đó mảng có sọc có vẻ có hiệu suất nhanh hơn ma trận khó khăn.

phiên bản sử dụng:

NumPy: 1.7.1

IPython: 0.13.2

Python: 2,7

Các vấn đề liên quan