Có một vài điều đang diễn ra ở đây: hoạt động vector của numpy, thêm trục đơn và phát sóng.
Trước tiên, bạn sẽ có thể thấy cách thực hiện phép thuật ==
.
Giả sử chúng ta bắt đầu với một mảng nhãn đơn giản. ==
hoạt động theo kiểu vectơ hóa, có nghĩa là chúng ta có thể so sánh toàn bộ mảng với vô hướng và nhận được một mảng bao gồm các giá trị của từng so sánh từng phần tử. Ví dụ:
Đầu tiên chúng tôi nhận được một mảng boolean, sau đó chúng tôi ép buộc để nổi: False == 0 in Python và True == 1. Vì vậy, chúng tôi kết thúc với một mảng là 0 trong đó labels
không bằng 0 và 1 ở đâu.
Nhưng không có gì đặc biệt về so với 0 là, chúng ta có thể so sánh với 1 hoặc 2 hoặc 3 thay thế cho kết quả tương tự:
>>> (labels == 2).astype(np.float32)
array([ 0., 1., 0., 0., 1.], dtype=float32)
Trong thực tế, chúng ta có thể lặp qua tất cả các nhãn có thể và tạo ra mảng này. Chúng tôi có thể sử dụng một listcomp:
>>> np.array([(labels == i).astype(np.float32) for i in np.arange(3)])
array([[ 0., 0., 1., 1., 0.],
[ 1., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 1.]], dtype=float32)
nhưng điều này thực sự không tận dụng lợi thế. Những gì chúng ta muốn làm là có mỗi nhãn có thể so sánh với mỗi phần tử, IOW để so sánh
>>> np.arange(3)
array([0, 1, 2])
với
>>> labels
array([1, 2, 0, 0, 2])
Và đây là nơi mà sự kỳ diệu của truyền NumPy đến. Ngay bây giờ, labels
là một Đối tượng hình dạng 1 chiều (5,). Nếu chúng ta tạo thành đối tượng hình dạng 2 chiều (5,1) thì thao tác sẽ "phát sóng" trên trục cuối cùng và chúng ta sẽ nhận được kết quả hình dạng (5,3) với kết quả so sánh từng mục nhập trong phạm vi với từng phần tử của nhãn.
Đầu tiên chúng ta có thể thêm một "thêm" trục labels
sử dụng None
(hoặc np.newaxis
), thay đổi hình dạng của nó:
>>> labels[:,None]
array([[1],
[2],
[0],
[0],
[2]])
>>> labels[:,None].shape
(5, 1)
Và sau đó chúng ta có thể làm cho việc so sánh (đây là transpose của sự sắp xếp chúng tôi nhìn vào trước đó, nhưng điều đó không quan trọng).
>>> np.arange(3) == labels[:,None]
array([[False, True, False],
[False, False, True],
[ True, False, False],
[ True, False, False],
[False, False, True]], dtype=bool)
>>> (np.arange(3) == labels[:,None]).astype(np.float32)
array([[ 0., 1., 0.],
[ 0., 0., 1.],
[ 1., 0., 0.],
[ 1., 0., 0.],
[ 0., 0., 1.]], dtype=float32)
Phát sóng trong phần mềm là rất mạnh mẽ và đáng để đọc.
Một lời giải thích rất chi tiết & thoải mái. Hầu hết những người đi qua khóa học Sâu sắc của Udacity, chắc hẳn đã vấp phải câu trả lời này. – AgentX