Dữ liệu trong mảng NumPy có thể được truy cập trực tiếp thông qua chỉ mục cột và hàng và điều này khá đơn giản. Tuy nhiên, đôi khi chúng ta phải thực hiện các thao tác trên các mảng dữ liệu như tổng hoặc giá trị trung bình của các giá trị theo hàng hoặc cột và điều này yêu cầu phải chỉ định trục của thao tác
Thật không may, các thao tác theo cột và theo hàng trên mảng NumPy không khớp với trực giác của chúng tôi thu được từ việc lập chỉ mục theo hàng và cột và điều này có thể gây nhầm lẫn cho người mới bắt đầu cũng như những người thực hành máy học dày dặn. Cụ thể, các hoạt động như tính tổng có thể được thực hiện theo cột bằng cách sử dụng axis=0 và theo hàng bằng cách sử dụng axis=1
Trong hướng dẫn này, bạn sẽ khám phá cách truy cập và thao tác trên mảng NumPy theo hàng và theo cột
Sau khi hoàn thành hướng dẫn này, bạn sẽ biết
- Cách xác định mảng NumPy với các hàng và cột dữ liệu
- Cách truy cập các giá trị trong mảng NumPy theo chỉ mục hàng và cột
- Cách thực hiện các thao tác trên mảng NumPy theo trục hàng và cột
Bắt đầu nào
Cách đặt trục NumPy cho hàng và cột trong Python
Ảnh của Jonathan Cutrer, bảo lưu một số quyền.
Hướng dẫn tổng quan
Hướng dẫn này được chia thành ba phần;
- Mảng NumPy có hàng và cột
- Hàng và cột dữ liệu trong mảng NumPy
- Hoạt động mảng NumPy theo hàng và cột
- Hoạt động Axis=None Array-Wise
- Axis=0 Hoạt động theo cột
- Axis=1 Row-Wise Operation
Mảng NumPy có hàng và cột
Trước khi chúng ta đi sâu vào trục mảng NumPy, hãy làm mới kiến thức của chúng ta về mảng NumPy
Thông thường trong Python, chúng tôi làm việc với danh sách số hoặc danh sách danh sách số. Ví dụ, chúng ta có thể định nghĩa một ma trận hai chiều gồm hai hàng ba số dưới dạng một danh sách các số như sau
1
2
3
.. .
# xác định dữ liệu dưới dạng danh sách
dữ liệu = [[1,2,3], [4,5,6]]
Một mảng NumPy cho phép chúng ta xác định và vận hành dựa trên các vectơ và ma trận của các số một cách hiệu quả, chẳng hạn như. g. hiệu quả hơn rất nhiều so với danh sách Python đơn giản. Mảng NumPy được gọi là NDArray và có thể có hầu như bất kỳ số lượng kích thước nào, mặc dù, trong học máy, chúng ta thường làm việc với mảng 1D và 2D [hoặc mảng 3D cho hình ảnh]
Ví dụ: chúng ta có thể chuyển đổi danh sách ma trận danh sách thành mảng NumPy thông qua hàm asarray[]
1
2
3
.. .
# chuyển đổi thành một mảng có nhiều mảng
dữ liệu = sự sắp xếp[dữ liệu]
Chúng ta có thể in mảng trực tiếp và mong muốn thấy hai hàng số, trong đó mỗi hàng có ba số hoặc cột
1
2
3
.. .
# tóm tắt nội dung mảng
in[dữ liệu]
Chúng ta có thể tóm tắt số chiều của một mảng bằng cách in thuộc tính “shape”, là một bộ, trong đó số lượng giá trị trong bộ xác định số lượng kích thước và số nguyên ở mỗi vị trí xác định kích thước của kích thước
Ví dụ: chúng tôi mong muốn hình dạng của mảng là [2,3] cho hai hàng và ba cột
1
2
3
.. .
# tóm tắt hình dạng mảng
in[dữ liệu. hình dạng]
Liên kết tất cả những điều này lại với nhau, một ví dụ hoàn chỉnh được liệt kê bên dưới
1
2
3
4
5
6
7
8
9
10
# tạo và tóm tắt một mảng có nhiều mảng
từ numpy nhập asarray
# xác định dữ liệu dưới dạng danh sách
dữ liệu = [[1,2,3], [4,5,6]]
# chuyển đổi thành một mảng có nhiều mảng
dữ liệu = sự sắp xếp[dữ liệu]
# tóm tắt nội dung mảng
in[dữ liệu]
# tóm tắt hình dạng mảng
in[dữ liệu. hình dạng]
Chạy ví dụ xác định dữ liệu của chúng tôi là một danh sách các danh sách, chuyển đổi nó thành một mảng NumPy, sau đó in dữ liệu và hình dạng
Chúng ta có thể thấy rằng khi mảng được in ra, nó có hình dạng mong muốn là hai hàng ba cột. Sau đó, chúng tôi có thể thấy rằng hình in phù hợp với mong đợi của chúng tôi
1
2
3
[[1 2 3]
[4 5 6]]
[2, 3]
Để biết thêm thông tin cơ bản về mảng NumPy, hãy xem hướng dẫn
- Giới thiệu nhẹ nhàng về mảng NumPy trong Python
Càng xa càng tốt
Nhưng làm thế nào để chúng ta truy cập dữ liệu trong mảng theo hàng hoặc cột?
Hãy xem xét kỹ hơn những câu hỏi này
Hàng và cột dữ liệu trong mảng NumPy
Thuộc tính "hình dạng" tóm tắt kích thước của dữ liệu của chúng tôi
Điều quan trọng, thứ nguyên đầu tiên xác định số lượng hàng và thứ nguyên thứ hai xác định số lượng cột. Ví dụ [2,3] xác định một mảng có hai hàng và ba cột, như chúng ta đã thấy trong phần trước
Chúng ta có thể liệt kê từng hàng dữ liệu trong một mảng bằng cách liệt kê từ chỉ số 0 đến chiều đầu tiên của hình dạng mảng, e. g. hình dạng[0]. Ta có thể truy cập dữ liệu trong mảng thông qua chỉ số hàng và chỉ số cột
Ví dụ: data[0, 0] là giá trị ở hàng đầu tiên và cột đầu tiên, trong khi data[0,. ] là các giá trị trong hàng đầu tiên và tất cả các cột, e. g. hàng đầu tiên hoàn chỉnh trong ma trận của chúng tôi
Ví dụ dưới đây liệt kê tất cả các hàng trong dữ liệu và in lần lượt từng hàng
1
2
3
4
5
6
7
8
9
# liệt kê các hàng trong một mảng gọn gàng
từ numpy nhập asarray
# xác định dữ liệu dưới dạng danh sách
dữ liệu = [[1,2,3], [4,5,6]]
# chuyển đổi thành một mảng có nhiều mảng
dữ liệu = sự sắp xếp[dữ liệu]
# bước qua các hàng
cho hàng trong phạm vi[data.hình dạng[0]] . :
in[dữ liệu[hàng, :]]
Như mong đợi, kết quả hiển thị hàng dữ liệu đầu tiên, sau đó là hàng dữ liệu thứ hai
1
2
[1 2 3]
[4 5 6]
Chúng ta có thể đạt được hiệu ứng tương tự cho các cột
Tức là chúng ta có thể liệt kê dữ liệu theo cột. Ví dụ: dữ liệu [. , 0] truy cập tất cả các hàng cho cột đầu tiên. Chúng ta có thể liệt kê tất cả các cột từ cột 0 đến cột cuối cùng được xác định bởi thứ nguyên thứ hai của thuộc tính “hình dạng”, e. g. hình dạng[1]
Ví dụ dưới đây chứng minh điều này bằng cách liệt kê tất cả các cột trong ma trận của chúng tôi
1
2
3
4
5
6
7
8
9
# liệt kê các cột trong một mảng gọn gàng
từ numpy nhập asarray
# xác định dữ liệu dưới dạng danh sách
dữ liệu = [[1,2,3], [4,5,6]]
# chuyển đổi thành một mảng có nhiều mảng
dữ liệu = sự sắp xếp[dữ liệu]
# bước qua các cột
cho col trong phạm vi[data.hình dạng[1]] . :
in[dữ liệu[. , col]]
Chạy ví dụ liệt kê và in từng cột trong ma trận
Cho rằng ma trận có ba cột, chúng ta có thể thấy rằng kết quả là chúng ta in ba cột, mỗi cột dưới dạng một vectơ một chiều. Đó là cột 1 [chỉ mục 0] có giá trị 1 và 4, cột 2 [chỉ mục 1] có giá trị 2 và 5 và cột 3 [chỉ mục 2] có giá trị 3 và 6
Nó chỉ trông buồn cười vì các cột của chúng ta trông không giống các cột;
1
2
3
[1 4]
[2 5]
[3 6]
Bây giờ chúng ta biết cách truy cập dữ liệu trong một mảng có nhiều mảng theo cột và theo hàng
Cho đến nay, rất tốt, nhưng còn các thao tác trên mảng theo cột và mảng thì sao?
Hoạt động mảng NumPy theo hàng và cột
Chúng ta thường cần thực hiện các thao tác trên mảng NumPy theo cột hoặc theo hàng
Ví dụ: chúng ta có thể cần tính tổng các giá trị hoặc tính giá trị trung bình cho một ma trận dữ liệu theo hàng hoặc theo cột
Điều này có thể đạt được bằng cách sử dụng hàm sum[] hoặc mean[] NumPy và chỉ định "trục" để thực hiện thao tác
Chúng ta có thể chỉ định trục là thứ nguyên mà thao tác sẽ được thực hiện và thứ nguyên này không khớp với trực giác của chúng ta dựa trên cách chúng ta diễn giải “hình dạng” của mảng và cách chúng ta lập chỉ mục dữ liệu trong mảng
Như vậy, điều này gây ra sự nhầm lẫn tối đa cho người mới bắt đầu
Nghĩa là, axis=0 sẽ thực hiện thao tác theo cột và axis=1 sẽ thực hiện thao tác theo hàng. Chúng ta cũng có thể chỉ định trục là Không có, trục này sẽ thực hiện thao tác cho toàn bộ mảng
Tóm tắt
- trục=Không có. Áp dụng thao tác theo mảng
- trục=0. Áp dụng thao tác theo cột, trên tất cả các hàng cho mỗi cột
- trục=1. Áp dụng thao tác theo hàng, trên tất cả các cột cho mỗi hàng
Hãy làm cho điều này cụ thể với một ví dụ đã làm việc
Chúng tôi sẽ tính tổng các giá trị trong mảng của chúng tôi theo từng trục trong số ba trục
Hoạt động Axis=None Array-Wise
Đặt axis=None khi thực hiện thao tác trên mảng NumPy sẽ thực hiện thao tác cho toàn bộ mảng
Đây thường là giá trị mặc định cho hầu hết các hoạt động, chẳng hạn như tổng, giá trị trung bình, tiêu chuẩn, v.v.
1
2
3
.. .
# tính tổng dữ liệu theo mảng
kết quả = dữ liệu. tổng[trục=Không]
Ví dụ dưới đây minh họa tính tổng tất cả các giá trị trong một mảng, e. g. một hoạt động khôn ngoan mảng
1
2
3
4
5
6
7
8
9
10
11
12
# tính tổng các giá trị theo mảng
từ numpy nhập asarray
# xác định dữ liệu dưới dạng danh sách
dữ liệu = [[1,2,3], [4,5,6]]
# chuyển đổi thành một mảng có nhiều mảng
dữ liệu = sự sắp xếp[dữ liệu]
# tóm tắt nội dung mảng
in[dữ liệu]
# tính tổng dữ liệu theo mảng
kết quả = dữ liệu. tổng[trục=Không]
# tóm tắt kết quả
in[kết quả]
Chạy ví dụ đầu tiên in mảng, sau đó thực hiện phép tính tổng theo mảng và in kết quả
Chúng ta có thể thấy mảng có sáu giá trị có tổng bằng 21 nếu chúng ta thêm chúng theo cách thủ công và kết quả của phép tính tổng được thực hiện theo mảng phù hợp với kỳ vọng này
1
2
3
4
[[1 2 3]
[4 5 6]]
21
Axis=0 Hoạt động theo cột
Đặt axis=0 khi thực hiện thao tác trên mảng NumPy sẽ thực hiện thao tác theo cột, nghĩa là trên tất cả các hàng cho mỗi cột
1
2
3
.. .
# tính tổng dữ liệu theo cột
kết quả = dữ liệu. tổng[trục=0]
Ví dụ: với dữ liệu của chúng tôi có hai hàng và ba cột
1
2
Dữ liệu = [[1, 2, 3],
4, 5, 6]]
Chúng tôi mong đợi tổng theo cột với axis=0 sẽ dẫn đến ba giá trị, một giá trị cho mỗi cột, như sau
- Cột 1. 1 + 4 = 5
- Cột 2. 2 + 5 = 7
- Cột 3. 3 + 6 = 9
Ví dụ dưới đây minh họa tổng các giá trị trong mảng theo cột, e. g. một hoạt động theo cột
1
2
3
4
5
6
7
8
9
10
11
12
# tổng giá trị theo cột
từ numpy nhập asarray
# xác định dữ liệu dưới dạng danh sách
dữ liệu = [[1,2,3], [4,5,6]]
# chuyển đổi thành một mảng có nhiều mảng
dữ liệu = sự sắp xếp[dữ liệu]
# tóm tắt nội dung mảng
in[dữ liệu]
# tính tổng dữ liệu theo cột
kết quả = dữ liệu. tổng[trục=0]
# tóm tắt kết quả
in[kết quả]
Chạy ví dụ đầu tiên in mảng, sau đó thực hiện phép tính tổng theo cột và in kết quả
Chúng ta có thể thấy mảng có sáu giá trị với hai hàng và ba cột như mong đợi;
1
2
3
[[1 2 3]
[4 5 6]]
[5 7 9]
Axis=1 Row-Wise Operation
Đặt axis=1 khi thực hiện thao tác trên mảng NumPy sẽ thực hiện thao tác theo hàng, nghĩa là trên tất cả các cột cho mỗi hàng
1
2
3
.. .
# tính tổng dữ liệu theo hàng
kết quả = dữ liệu. tổng[trục=1]
Ví dụ: với dữ liệu của chúng tôi có hai hàng và ba cột
1
2
Dữ liệu = [[1, 2, 3],
4, 5, 6]]
Chúng tôi mong đợi một tổng theo hàng với axis=1 sẽ dẫn đến hai giá trị, một giá trị cho mỗi hàng, như sau
- Hàng 1. 1 + 2 + 3 = 6
- Hàng 2. 4 + 5 + 6 = 15
Ví dụ dưới đây minh họa tổng các giá trị trong mảng theo hàng, e. g. một hoạt động khôn ngoan hàng
1
2
3
4
5
6
7
8
9
10
11
12
# tổng giá trị theo hàng
từ numpy nhập asarray
# xác định dữ liệu dưới dạng danh sách
dữ liệu = [[1,2,3], [4,5,6]]
# chuyển đổi thành một mảng có nhiều mảng
dữ liệu = sự sắp xếp[dữ liệu]
# tóm tắt nội dung mảng
in[dữ liệu]
# tính tổng dữ liệu theo hàng
kết quả = dữ liệu. tổng[trục=1]
# tóm tắt kết quả
in[kết quả]
Chạy ví dụ đầu tiên in mảng, sau đó thực hiện thao tác tính tổng theo hàng và in kết quả
Chúng ta có thể thấy mảng có sáu giá trị với hai hàng và ba cột như mong đợi;
1
2
3
[[1 2 3]
[4 5 6]]
[ 6 15]
Bây giờ chúng tôi có một ý tưởng cụ thể về cách đặt trục thích hợp khi thực hiện các thao tác trên mảng NumPy của chúng tôi