NumPy Broadcasting

Numpy Broadcasting



Các mảng có kích thước khác nhau không thể được thêm vào, trừ đi hoặc sử dụng trong số học. Nhân bản mảng nhỏ để cung cấp cho nó cùng kích thước và kích thước với mảng lớn hơn là một cách tiếp cận. Khi tiến hành số học mảng, NumPy cung cấp một tính năng được gọi là phát sóng mảng có thể rút ngắn và đơn giản hóa đáng kể mã của bạn. Bạn sẽ tìm hiểu về ý tưởng phát sóng mảng và cách sử dụng nó trong NumPy trong hướng dẫn này. Ngoài ra, một số chương trình ví dụ được cung cấp.

NumPy Broadcasting là gì?

Khi thực hiện các phép toán số học trên các mảng có dạng khác nhau, NumPy gọi đây là phát sóng. Các hoạt động mảng này thường xuyên được thực hiện trên các phần tử tương ứng. Nếu hai mảng có cùng hình dạng, nó có thể được thực hiện trên chúng một cách dễ dàng. Mặc dù khái niệm này hữu ích, nhưng không phải lúc nào việc phát sóng cũng được khuyến khích vì nó có thể dẫn đến việc sử dụng bộ nhớ không hiệu quả làm chậm quá trình tính toán. Các phép toán NumPy thường được thực hiện trên các cặp mảng được chia nhỏ theo từng phần tử.

Quy tắc phát sóng

Một bộ nguyên tắc cụ thể phải được tuân thủ khi phát sóng. Chúng được mô tả dưới đây:







  1. Hình dạng mảng có thứ hạng thấp hơn rất quan trọng phải được thêm vào trước với 1s cho đến khi cả hai hình dạng của mảng có cùng độ dài nếu hai mảng không có cùng thứ hạng.
  2. Hai mảng được coi là tương thích nếu chúng có cùng kích thước thứ nguyên hoặc nếu một trong số chúng có kích thước thứ nguyên được đặt thành 1.
  3. Các mảng chỉ có thể được phát cùng nhau nếu kích thước và thứ nguyên của chúng khớp với nhau.
  4. Khi quá trình phát sóng hoàn tất, mọi mảng hoạt động như thể dạng của nó khớp với dạng của phần tử lớn nhất trong hình dạng của hai mảng đầu vào.
  5. Một trong các mảng hoạt động như thể nó được sao chép với kích thước đó nếu mảng kia có kích thước lớn hơn 1 và mảng đầu tiên có kích thước là 1.

Bây giờ, hãy thảo luận một số ví dụ về việc triển khai khái niệm truyền phát.



Ví dụ 1:

Trên các cặp mảng, các phép toán NumPy thường được thực hiện theo từng phần tử. Trong trường hợp đơn giản nhất, hai mảng phải có cùng hình dạng, như trong ví dụ dưới đây:



nhập khẩu numpy

one_arr = numpy. mảng ( [ 2.0 , 3.0 , 1,0 ] )

two_arr = numpy. mảng ( [ 3.0 , 3.0 , 3.0 ] )

in ( one_arr * two_arr )





Như bạn có thể thấy từ đoạn mã trên, chúng ta có hai mảng: ‘one_arr’ và ‘two_ arr’. Mỗi trong số đó có một bộ giá trị riêng biệt. Các giá trị trong ‘one_arr’ là [2.0,3.0,1.0] và ‘two _arr’ là [3.0,3.0,3.0]. Khi đó, bạn có thể thấy rằng kết quả của phép tính tích của hai mảng này như sau:



Khi các yêu cầu nhất định được đáp ứng bởi các biểu mẫu của mảng, quy tắc phát sóng của NumPy sẽ giảm bớt hạn chế này. Khi một mảng và một giá trị vô hướng được tham gia vào một hoạt động, việc phát sóng được thể hiện ở dạng cơ bản nhất của nó. Như bạn có thể thấy, 3 được chứa trong biến có tên là ‘two_arr.’

nhập khẩu numpy

one_arr = numpy. mảng ( [ 2.0 , 3.0 , 1,0 ] )

two_arr = 3.0

in ( one_arr * two_arr )

Đoạn mã trên tạo ra kết quả sau.

Trong ví dụ trước, trong đó ‘hai_arr’ là một mảng, kết quả là tương đương. Chúng ta có thể hình dung đại lượng vô hướng ‘hai_arr’ đang được mở rộng trong quá trình số học thành một mảng có hình dạng giống như ‘một _arr.’ Mảng ‘hai_arr’ chứa các phần tử mới chỉ là bản sao của đại lượng vô hướng đầu tiên. Sự so sánh kéo dài chỉ là giả thuyết. Để thực hiện các hoạt động truyền phát dưới dạng bộ nhớ và khả thi về mặt tính toán, NumPy đủ thông minh để sử dụng giá trị vô hướng gốc thay vì tạo ra các bản sao.

Ví dụ 2:

Đây là một chương trình Python đơn giản khác thực hiện phát sóng. Một lần nữa, hai mảng được tạo ra chứa các giá trị khác nhau. Cần phải định hình lại ‘first_arr’ thành một vectơ cột có hình dạng 3 × 1 để tính tích ngoài. Sau đó, quá trình phát sóng được thực hiện với 'second_arr' để cung cấp kết quả có kích thước 3 × 2, được gọi là tích ngoài của 'first_arr' và 'second_arr.' Có thể phát sóng tới 2 × 3 vì 'result_arr' có hình dạng 2 × 3 cũng như hình dạng (3,).

Sau khi làm theo tất cả các bước nêu trên, một vectơ phải được bao gồm trong mọi cột của ma trận là 'result_arr' và 'second_arr.' Những ma trận này có kích thước là 2 × 3 và (2,). Việc hoán vị ‘result_arr’ sẽ mang lại hình dạng 3 × 2, hình dạng này sau đó có thể được phát sóng với ‘second_arr’ để có được hình dạng tương tự. Thông thường, chuyển vị này tạo ra sản phẩm cuối cùng có hình dạng 2 × 3.

nhập khẩu numpy

first_arr = numpy. mảng ( [ 12 , 24 , 14 ] )

second_arr = numpy. mảng ( [ mười lăm , 22 ] )

in ( numpy. định hình lại ( first_arr , ( 3 , 1 ) ) * second_arr )

result_arr = numpy. mảng ( [ [ 12 , 22 , 31 ] , [ mười lăm , 22 , Bốn năm ] ] )

in ( result_arr + first_arr )

in ( ( result_arr. T + second_arr ) . T )

in ( result_arr + numpy. định hình lại ( second_arr , ( hai , 1 ) ) )

in ( result_arr * hai )

Bạn có thể xem kết quả bên dưới.

Ví dụ 3:

Một mảng ba chiều có thể được phát sóng bằng chương trình Python sau. Trong ví dụ này, hai mảng có tên ‘first_arr’ và ‘second_arr’ đã được tạo. Mảng ‘first_arr’ chứa [4,13,26,12] giá trị và ‘second_arr’ chứa [32,67,45,17] giá trị. 2 thứ nguyên của mảng ban đầu tạo ra sự khác biệt. Tổng của mảng thứ nhất và thứ hai sẽ được hiển thị bên dưới sau khi mã được thực thi. Bạn có thể thấy rằng chúng ta có ba câu lệnh in trong mã, mỗi câu lệnh sẽ hiển thị lần lượt văn bản ‘Mảng thứ nhất:’, ‘Mảng thứ hai’ và ‘Mảng thứ ba:’. Sau đó, tổng của hai mảng mới được tạo này sẽ được hiển thị.

nhập khẩu numpy

first_arr = numpy. mảng ( [ [ 4 , 13 , 26 , 12 ] , [ 32 , 67 , Bốn năm , 17 ] ] )

second_arr = numpy. mảng ( [ 24 , Bốn năm , 66 , 87 ] )

in ( ' \N Mảng đầu tiên: ' )

in ( first_arr )

in ( ' \N Mảng thứ hai: ' )

in ( second_arr )

in ( ' \N Tổng của mảng thứ nhất và thứ hai: ' )

sum_result = first_arr + second_arr ;

in ( sum_result )

Đây là ảnh chụp màn hình đầu ra của mã đã cho.

Ví dụ 4:

Chương trình Python cuối cùng phát một mảng ba chiều được đưa ra ở đây. Hai mảng được chỉ định trong chương trình này, mảng đầu tiên có ba chiều. Tổng của mảng thứ nhất và thứ hai sẽ được hiển thị như hình trên sau khi mã được thực thi. Mặc dù các giá trị trong các mảng này khác nhau, nhưng mã còn lại vẫn giống như mã được sử dụng trong chương trình ví dụ ở trên.

nhập khẩu numpy

first_arr = numpy. mảng ( [ [ 12 , Bốn năm , 22 , 13 ] , [ 22 , 54 , 25 , 12 ] , [ năm mươi , 40 , 18 , 26 ] ] )

second_arr = numpy. mảng ( [ 12 , 44 , 22 , 12 ] )

in ( ' \N Mảng đầu tiên: ' )

in ( first_arr )

in ( ' \N Mảng thứ hai: ' )

in ( second_arr )

in ( ' \N Tổng của mảng thứ nhất và thứ hai: ' )

sum_result = first_arr + second_arr ;

in ( sum_result )

Bạn có thể thấy trong hình bên dưới rằng mảng 3 chiều từ mảng đầu tiên được trình bày, tiếp theo là mảng 2 chiều từ mảng thứ hai và kết quả của hai mảng này sử dụng nguyên tắc phát sóng.

Sự kết luận

Bài viết này đã thảo luận về phát sóng, một khái niệm quan trọng của Python. Trong NumPy, thuật ngữ ‘phát sóng’ đề cập đến khả năng xử lý các mảng có nhiều hình dạng khác nhau trong khi thực hiện các phép toán số học thường xuyên được thực hiện. Chủ đề nói trên đã được đề cập kỹ lưỡng với nhiều ví dụ. Bài viết này đã sử dụng các chương trình ví dụ đã đề cập để trình bày cách phát sóng trên các mảng 1-D, 2-D và 3-D, tương ứng. Bạn có thể thử chạy các ví dụ này trên hệ thống của mình và xem kết quả để hiểu rõ hơn cách mọi thứ hoạt động nói chung.