Hướng dẫn argmax python
Trong hướng dẫn này, bạn sẽ học cách sử dụng hàm NumPy argmax () để tìm chỉ số của phần tử tối đa trong mảng. Show
NumPy là một thư viện mạnh mẽ cho tính toán khoa học bằng Python; nó cung cấp mảng N-chiều có hiệu suất cao hơn danh sách Python. Một trong những thao tác phổ biến bạn sẽ thực hiện khi làm việc với mảng NumPy là tìm giá trị lớn nhất trong mảng. Tuy nhiên, đôi khi bạn có thể muốn tìm chỉ mục tại đó giá trị lớn nhất xảy ra. Hàm argmax () giúp bạn tìm chỉ số của giá trị lớn nhất trong cả mảng một chiều và nhiều chiều. Chúng ta hãy tiến hành tìm hiểu cách thức hoạt động của nó.
Cách tìm chỉ mục của phần tử tối đa trong mảng NumPyĐể làm theo hướng dẫn này, bạn cần cài đặt Python và NumPy. Bạn có thể viết mã bằng cách khởi động Python REPL hoặc khởi chạy sổ ghi chép Jupyter. Đầu tiên, hãy nhập NumPy với bí danh thông thường là np. import numpy as np Bạn có thể sử dụng hàm NumPy max () để nhận giá trị lớn nhất trong một mảng (tùy chọn dọc theo một trục cụ thể). array_1 = np.array([1,5,7,2,10,9,8,4]) print(np.max(array_1)) # Output 10 Trong trường hợp này, np.max (array_1) trả về 10, điều này đúng. Giả sử bạn muốn tìm chỉ mục mà tại đó giá trị lớn nhất xuất hiện trong mảng. Bạn có thể thực hiện phương pháp tiếp cận hai bước sau: Trong mảng_1, giá trị lớn nhất của 10 xuất hiện ở chỉ mục 4, sau khi lập chỉ mục bằng không. Phần tử đầu tiên ở chỉ số 0; phần tử thứ hai ở chỉ mục 1, v.v. Để tìm chỉ mục tại đó giá trị lớn nhất xảy ra, bạn có thể sử dụng hàm NumPy where (). np.where (điều kiện) trả về một mảng tất cả các chỉ số trong đó điều kiện là Đúng. Bạn sẽ phải nhấn vào mảng và truy cập mục ở chỉ mục đầu tiên. Để tìm giá trị lớn nhất xảy ra ở đâu, chúng ta đặt điều kiện là array_1 == 10; nhớ lại rằng 10 là giá trị lớn nhất trong mảng_1. print(int(np.where(array_1==10)[0])) # Output 4 Chúng tôi đã sử dụng np.where () chỉ với điều kiện, nhưng đây không phải là phương pháp được khuyến nghị để sử dụng hàm này. 📑 Lưu ý: Hàm NumPy where (): – Các phần tử từ x khi điều kiện là Đúng, và Do đó, xâu chuỗi các hàm np.max () và np.where (), chúng ta có thể tìm thấy phần tử lớn nhất, theo sau là chỉ số mà nó xuất hiện. Thay vì quy trình hai bước ở trên, bạn có thể sử dụng hàm NumPy argmax () để lấy chỉ số của phần tử tối đa trong mảng. Cú pháp chung để sử dụng hàm NumPy argmax () như sau: np.argmax(array,axis,out) # we've imported numpy under the alias np Trong cú pháp trên:
Lưu ý: Từ phiên bản NumPy 1.22.0, có một tham số keepdims bổ sung. Khi chúng ta chỉ định tham số trục trong lệnh gọi hàm argmax (), mảng được giảm dọc theo trục đó. Nhưng việc đặt tham số keepdims thành True đảm bảo rằng đầu ra trả về có cùng hình dạng với mảng đầu vào. Sử dụng NumPy argmax () để tìm chỉ mục của phần tử tối đa# 1. Chúng ta hãy sử dụng hàm NumPy argmax () để tìm chỉ số của phần tử lớn nhất trong mảng_1. array_1 = np.array([1,5,7,2,10,9,8,4]) print(np.argmax(array_1)) # Output 4 Hàm argmax () trả về 4, đúng! ✅ # 2. Nếu chúng ta xác định lại mảng_1 sao cho 10 xảy ra hai lần, thì hàm argmax () chỉ trả về chỉ số của lần xuất hiện đầu tiên. array_1 = np.array([1,5,7,2,10,10,8,4]) print(np.argmax(array_1)) # Output 4 Đối với phần còn lại của các ví dụ, chúng tôi sẽ sử dụng các phần tử của mảng_1 mà chúng tôi đã xác định trong ví dụ # 1. Sử dụng NumPy argmax () để tìm chỉ mục của phần tử tối đa trong mảng 2DHãy định hình lại mảng NumPy array_1 thành một mảng hai chiều với hai hàng và bốn cột. array_2 = array_1.reshape(2,4) print(array_2) # Output [[ 1 5 7 2] [10 9 8 4]] Đối với mảng hai chiều, trục 0 biểu thị các hàng và trục 1 biểu thị các cột. Mảng NumPy tuân theo lập chỉ mục bằng không. Vì vậy, chỉ số của các hàng và cột cho mảng NumPy array_2 như sau: Bây giờ, hãy gọi hàm argmax () trên mảng hai chiều, mảng_2. print(np.argmax(array_2)) # Output 4 Mặc dù chúng ta đã gọi argmax () trên mảng hai chiều, nó vẫn trả về 4. Điều này giống với kết quả đầu ra cho mảng một chiều, mảng_1 từ phần trước. Lý do tại sao điều này xảy ra? 🤔 Điều này là do chúng tôi chưa chỉ định bất kỳ giá trị nào cho tham số trục. Khi tham số trục này không được đặt, theo mặc định, hàm argmax () trả về chỉ số của phần tử lớn nhất dọc theo mảng phẳng. Mảng phẳng là gì? Nếu có một mảng N chiều hình dạng d1 x d2 x… x dN, trong đó d1, d2, lên đến dN là kích thước của mảng dọc theo N kích thước, thì mảng phẳng là một mảng dài một chiều có kích thước d1 * d2 *… * dN. Để kiểm tra mảng phẳng trông như thế nào đối với mảng_2, bạn có thể gọi phương thức flatten (), như được hiển thị bên dưới: array_2.flatten() # Output array([ 1, 5, 7, 2, 10, 9, 8, 4]) Chỉ mục của phần tử tối đa dọc theo hàng (trục = 0)Hãy tiến hành tìm chỉ số của phần tử lớn nhất dọc theo các hàng (trục = 0). np.argmax(array_2,axis=0) # Output array([1, 1, 1, 1]) Đầu ra này có thể hơi khó hiểu, nhưng chúng tôi sẽ hiểu cách hoạt động của nó. Chúng tôi đã đặt thông số trục thành 0 (axis = 0), vì chúng tôi muốn tìm chỉ số của phần tử lớn nhất dọc theo các hàng. Do đó, hàm argmax () trả về số hàng trong đó phần tử lớn nhất xuất hiện — cho mỗi cột trong số ba cột. Hãy hình dung điều này để hiểu rõ hơn. Từ sơ đồ trên và đầu ra argmax (), chúng ta có như sau:
Đây chính là lý do tại sao chúng ta có mảng đầu ra ([1, 1, 1, 1]) vì phần tử lớn nhất dọc theo các hàng xảy ra ở hàng thứ hai (cho tất cả các cột). Chỉ mục của phần tử tối đa dọc theo cột (trục = 1)Tiếp theo, hãy sử dụng hàm argmax () để tìm chỉ số của phần tử lớn nhất dọc theo các cột. Chạy đoạn mã sau và quan sát đầu ra. np.argmax(array_2,axis=1) array([2, 0]) Bạn có thể phân tích cú pháp đầu ra không? Chúng tôi đã đặt axis = 1 để tính chỉ số của phần tử lớn nhất dọc theo các cột. Hàm argmax () trả về, đối với mỗi hàng, số cột trong đó giá trị lớn nhất xảy ra. Đây là một lời giải thích trực quan: Từ sơ đồ trên và đầu ra argmax (), chúng ta có như sau:
Tôi hy vọng bây giờ bạn đã hiểu đầu ra, mảng ([2, 0]) có nghĩa. Sử dụng Tham số tùy chọn ra trong NumPy argmax ()Bạn có thể sử dụng tham số tùy chọn trong hàm NumPy argmax () để lưu trữ đầu ra trong một mảng NumPy. Hãy khởi tạo một mảng các số 0 để lưu trữ đầu ra của lệnh gọi hàm argmax () trước đó – để tìm chỉ số của giá trị lớn nhất dọc theo các cột (trục = 1). out_arr = np.zeros((2,)) print(out_arr) [0. 0.] Bây giờ, chúng ta hãy xem lại ví dụ về việc tìm chỉ số của phần tử tối đa dọc theo các cột (axis = 1) và thiết lập thành out_arr mà chúng ta đã xác định ở trên. np.argmax(array_2,axis=1,out=out_arr) Chúng ta thấy rằng trình thông dịch Python ném ra một TypeError, vì out_arr đã được khởi tạo thành một mảng float theo mặc định. --------------------------------------------------------------------------- TypeError Traceback (most recent call last) /usr/local/lib/python3.7/dist-packages/numpy/core/fromnumeric.py in _wrapfunc(obj, method, *args, **kwds) 56 try: ---> 57 return bound(*args, **kwds) 58 except TypeError: TypeError: Cannot cast array data from dtype('float64') to dtype('int64') according to the rule 'safe' Do đó, khi đặt tham số out cho mảng đầu ra, điều quan trọng là đảm bảo rằng mảng đầu ra có hình dạng và kiểu dữ liệu chính xác. Vì chỉ số mảng luôn là số nguyên, chúng ta nên đặt tham số dtype thành int khi xác định mảng đầu ra. out_arr = np.zeros((2,),dtype=int) print(out_arr) # Output [0 0] Bây giờ chúng ta có thể tiếp tục và gọi hàm argmax () với cả tham số trục và tham số ra, và lần này, nó chạy mà không có lỗi. np.argmax(array_2,axis=1,out=out_arr) Đầu ra của hàm argmax () bây giờ có thể được truy cập trong mảng out_arr. print(out_arr) # Output [2 0] Sự kết luậnTôi hy vọng hướng dẫn này đã giúp bạn hiểu cách sử dụng hàm NumPy argmax (). Bạn có thể chạy các ví dụ mã trong sổ ghi chép Jupyter. Hãy xem lại những gì chúng ta đã học được.
Tiếp theo, hãy xem hướng dẫn chuyên sâu về các bộ Python. |