2013-04-01 41 views
5

Tôi đang sử dụng numpy.matrix. Nếu tôi thêm ma trận 3x3 với vectơ 1x3 hoặc 3x1. Tôi nhận được một ma trận 3x3 trở lại. Nếu điều này không được 'không xác định'? Và nếu không, giải thích cho điều này là gì?Ma trận khối u cộng với cột vectơ

Ví dụ

a = np.matrix('1 1 1; 1 1 1; 1 1 1') 
b = np.matrix('1 1 1') 
a + b #or a + np.transpose(b) 

Output:

matrix([[2, 2, 2], 
     [2, 2, 2], 
     [2, 2, 2]]) 

Trả lời

7

này được gọi là "phát sóng". Từ manual:

The term broadcasting describes how numpy treats arrays with different shapes during arithmetic operations. Subject to certain constraints, the smaller array is “broadcast” across the larger array so that they have compatible shapes. Broadcasting provides a means of vectorizing array operations so that looping occurs in C instead of Python. It does this without making needless copies of data and usually leads to efficient algorithm implementations. There are, however, cases where broadcasting is a bad idea because it leads to inefficient use of memory that slows computation.

+0

Nhờ giải thích nó. Vẫn chưa hiểu khái niệm đó, mặc dù thông báo lỗi đã chỉ tôi đến nó: "ValueError: toán hạng không thể được phát cùng với các hình dạng ..." – andershqst

5

Nếu bạn muốn thêm một vector để một ma trận, bạn có thể làm như vậy bằng cách chọn nơi cần đi:

In [155]: ma = np.matrix(
    ...:  [[ 1., 1., 1.], 
    ...:  [ 1., 1., 1.], 
    ...:  [ 1., 1., 1.]]) 

In [156]: mb = np.matrix([[1,2,3]]) 

In [157]: ma[1] += mb # second row 

In [158]: ma 
Out[158]: 
matrix([[ 1., 1., 1.], 
     [ 2., 3., 4.], 
     [ 1., 1., 1.]]) 

In [159]: ma[:,1] += mb.T # second column 

In [160]: ma 
Out[160]: 
matrix([[ 1., 2., 1.], 
     [ 2., 5., 4.], 
     [ 1., 4., 1.]]) 

Nhưng tôi muốn cảnh báo rằng bạn không sử dụng numpy.matrix như đã nêu. Thực tế, bạn đang sử dụng numpy.ndarraynp.ones trả về số ndarray và không phải là matrix.

Các thêm là vẫn như nhau, nhưng tạo ra một số ma trận, và bạn sẽ thấy rằng họ hành xử khác nhau:

In [161]: ma*mb 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 

ValueError: matrices are not aligned 

In [162]: mb*ma 
Out[162]: matrix([[ 6., 6., 6.]]) 

In [163]: ma*mb.T 
Out[163]: 
matrix([[ 6.], 
     [ 6.], 
     [ 6.]]) 

In [164]: aa = np.ones((3,3)) 

In [165]: ab = np.arange(1,4) 

In [166]: aa*ab 
Out[166]: 
array([[ 1., 2., 3.], 
     [ 1., 2., 3.], 
     [ 1., 2., 3.]]) 

In [167]: ab*aa 
Out[167]: 
array([[ 1., 2., 3.], 
     [ 1., 2., 3.], 
     [ 1., 2., 3.]]) 
+0

Arh vâng bạn đúng về ma trận. Tôi sẽ sửa câu hỏi của tôi. Tuy nhiên, câu hỏi của tôi là để bổ sung, nơi phát sóng dường như hoạt động như được chỉ ra trong câu trả lời được chấp nhận. – andershqst

+0

Có, vui lòng làm; Tôi chỉ muốn cảnh báo bạn về hành vi có thể bất ngờ. – askewchan

+0

Vâng, cảm ơn. – andershqst

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