2012-06-24 34 views
14

Tôi gặp sự cố khi hiểu các quy tắc phát sóng mảng trong Numpy.Quy tắc phát sóng mảng cố định

Rõ ràng, nếu bạn thực hiện phép nhân yếu tố trên hai mảng có cùng kích thước và hình dạng, mọi thứ đều ổn. Ngoài ra, nếu bạn nhân một mảng đa chiều bởi một vô hướng nó hoạt động. Điều này tôi hiểu.

Nhưng nếu bạn có hai mảng N chiều là các hình dạng khác nhau, tôi không rõ chính xác quy tắc phát sóng là gì. Điều này documentation/tutorial giải thích rằng: Để phát sóng, kích thước của trục sau cho cả hai mảng trong một thao tác phải có cùng kích thước hoặc một trong số chúng phải là một.

Được rồi, vì vậy tôi giả bởi trailing trục họ đang đề cập đến N trong một mảng M x N. Vì vậy, điều đó có nghĩa là nếu tôi cố gắng nhân hai mảng 2D (ma trận) với số cột bằng nhau, nó sẽ hoạt động? Ngoại trừ nó không ...

>>> from numpy import * 
>>> A = array([[1,2],[3,4]]) 
>>> B = array([[2,3],[4,6],[6,9],[8,12]]) 
>>> print(A) 
[[1 2] 
[3 4]] 
>>> print(B) 
[[ 2 3] 
[ 4 6] 
[ 6 9] 
[ 8 12]] 
>>> 
>>> A * B 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: shape mismatch: objects cannot be broadcast to a single shape 

Kể từ khi cả hai AB có hai cột, tôi đã có thể nghĩ điều này sẽ làm việc. Vì vậy, tôi có thể hiểu lầm một cái gì đó ở đây về thuật ngữ "trục sau", và làm thế nào nó áp dụng cho các mảng N-chiều.

Ai đó có thể giải thích lý do vì sao ví dụ của tôi không hoạt động và ý nghĩa của "trục sau" là gì?

+1

Đây là lời giải thích thực sự tốt về phát, http://www.scipy.org/EricsBroadcastingDoc –

+0

bạn có thể thêm thẻ "phát sóng" không? – denis

+0

Liên kết trong nhận xét @BiRico giờ đây là http://wiki.scipy.org/EricsBroadcastingDoc Tôi tự hỏi tại sao nó được chuyển tới bãi chứa * *. – iled

Trả lời

10

Vâng, ý nghĩa của trục sau được giải thích trên trang tài liệu được liên kết. Nếu bạn có hai mảng có số thứ nguyên khác nhau, hãy nói một số 1x2x32x3 khác, thì bạn chỉ so sánh các thứ nguyên phổ biến sau, trong trường hợp này là 2x3. Nhưng nếu cả hai mảng của bạn là hai chiều, thì kích thước tương ứng của chúng phải bằng nhau hoặc một trong số chúng phải là 1. Các kích thước mà mảng có kích thước 1 được gọi là số ít và mảng có thể được phát dọc theo chúng.

Trong trường hợp của bạn, bạn có một 2x24x24 != 2 và không 4 hoặc 2 bằng 1, vì vậy đây không hoạt động.

+0

Nói cách khác, 'hình dạng' của' A' phải là hậu tố của 'hình dạng' của' B ', bỏ qua bất kỳ trục có giá trị 1 (?) –

+1

nếu bằng cách bỏ qua bạn có nghĩa là '' 1' bằng bất cứ thứ gì' và 'hình dạng (A)' hoặc 'hình dạng (B)' có thể là hậu tố của nhau, thì có. – unkulunkulu

+1

thực sự, bạn có thể xem bất kỳ mảng nào là kích thước vô hạn của kích thước '... x1x1x1x1x1x1x1x ..... xAxBxC' vì vậy chúng tôi có rất nhiều' 1 'hàng đầu, có thể được phát như những người khác. Bằng cách này bạn có thể quên rằng hậu tố, chỉ cần nói '1' bằng bất cứ điều gì. – unkulunkulu