Skip to Content
Python📦 Thư viện NumpyBroadcasting (Cơ chế lan truyền)

Cơ chế lan truyền (Broadcasting)

Thuật ngữ cơ chế lan truyền (broadcasting) mô tả cách NumPy xử lý các mảng có hình dạng khác nhau trong các thao tác số học. Tuân theo một số ràng buộc nhất định, mảng nhỏ hơn sẽ được “lan truyền” trên khắp mảng lớn hơn để chúng có hình dạng tương thích.

Các quy tắc lan truyền chung

Khi thực hiện thao tác trên hai mảng, NumPy so sánh hình dạng của chúng theo từng phần tử. Nó bắt đầu từ chiều cuối cùng (tức là chiều ngoài cùng bên phải) và tiến dần về bên trái. Hai chiều được coi là tương thích khi:

  1. chúng bằng nhau, hoặc
  2. một trong số chúng bằng 1.

Nếu các điều kiện này không được đáp ứng, một ngoại lệ ValueError: operands could not be broadcast together sẽ được ném ra.

Các mảng đầu vào không cần phải có cùng số chiều. Mảng kết quả sẽ có cùng số chiều với mảng đầu vào có số chiều lớn nhất.

Các mảng có thể lan truyền

Một tập hợp các mảng được gọi là “có thể lan truyền” (broadcastable) về cùng một hình dạng nếu các quy tắc trên tạo ra kết quả hợp lệ.

Ví dụ, nếu a.shape là (5,1), b.shape là (1,6), c.shape là (6,) và d.shape là () (tức d là một vô hướng), thì a, b, c, và d đều có thể lan truyền về kích thước (5,6).

  • a hoạt động như một mảng (5,6) trong đó a[:,0] được lan truyền sang các cột khác,
  • b hoạt động như một mảng (5,6) trong đó b[0,:] được lan truyền sang các hàng khác,
  • c hoạt động như một mảng (1,6) và do đó giống như một mảng (5,6) trong đó c[:] được lan truyền sang mọi hàng,
  • d hoạt động như một mảng (5,6) trong đó giá trị đơn lẻ được lặp lại.

Ví dụ

import numpy as np A = np.zeros((2, 5)) B = np.zeros((5,)) # Kết quả: (2, 5) A = np.zeros((8, 1, 6, 1)) B = np.zeros((7, 1, 5)) # Kết quả: (8, 7, 6, 5)

Một ví dụ về cơ chế lan truyền khi một mảng 1-D được cộng vào một mảng 2-D:

a = np.array([[ 0.0, 0.0, 0.0], [10.0, 10.0, 10.0], [20.0, 20.0, 20.0], [30.0, 30.0, 30.0]]) b = np.array([1.0, 2.0, 3.0]) a + b # array([[ 1., 2., 3.], # [11., 12., 13.], # [21., 22., 23.], # [31., 32., 33.]])
Last updated on