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.

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
  • Cú pháp của hàm NumPy argmax []
  • Sử dụng NumPy argmax [] để tìm chỉ mục của phần tử tối đa
    • Sử dụng NumPy argmax [] để tìm chỉ mục của phần tử tối đa trong mảng 2D
    • Chỉ mục của phần tử tối đa dọc theo hàng [trục = 0]
    • Chỉ mục của phần tử tối đa dọc theo cột [trục = 1]
  • Sử dụng Tham số tùy chọn ra trong NumPy argmax []
    • Sự kết luận
    • Share this post!

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:

  • Tìm phần tử tối đa.
  • Tìm chỉ số của phần tử tối đa.
  • 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 []:
    np.where [điều kiện, x, y] trả về:

    – Các phần tử từ x khi điều kiện là Đúng, và
    – Các phần tử từ y khi điều kiện là Sai.

    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:

    • mảng là bất kỳ mảng NumPy hợp lệ nào.
    • trục là một tham số tùy chọn. Khi làm việc với mảng nhiều chiều, bạn có thể sử dụng tham số trục để tìm chỉ số tối đa dọc theo một trục cụ thể.
    • ra là một tham số tùy chọn khác. Bạn có thể đặt tham số out thành một mảng NumPy để lưu trữ đầu ra của hàm argmax [].

    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 2D

    Hã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:

    • Đối với cột đầu tiên ở chỉ mục 0, giá trị lớn nhất 10 xuất hiện ở hàng thứ hai, tại chỉ mục = 1.
    • Đối với cột thứ hai ở chỉ mục 1, giá trị lớn nhất 9 xuất hiện ở hàng thứ hai, tại chỉ mục = 1.
    • Đối với cột thứ ba và thứ tư ở chỉ mục 2 và 3, giá trị lớn nhất 8 và 4 đều xuất hiện ở hàng thứ hai, tại chỉ mục = 1.

    Đâ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:

    • Đối với hàng đầu tiên ở chỉ mục 0, giá trị lớn nhất 7 xuất hiện trong cột thứ ba, tại chỉ mục = 2.
    • Đối với hàng thứ hai ở chỉ mục 1, giá trị lớn nhất 10 xuất hiện trong cột đầu tiên, tại chỉ mục = 0.

    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ận

    Tô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.

    • Hàm NumPy argmax [] trả về chỉ số của phần tử tối đa trong một mảng. Nếu phần tử lớn nhất xuất hiện nhiều hơn một lần trong mảng a, thì np.argmax [a] trả về chỉ số của lần xuất hiện đầu tiên của phần tử.
    • Khi làm việc với mảng nhiều chiều, bạn có thể sử dụng tham số trục tùy chọn để lấy chỉ số của phần tử tối đa dọc theo một trục cụ thể. Ví dụ, trong mảng hai chiều: bằng cách đặt axis = 0 và axis = 1, bạn có thể nhận được chỉ số của phần tử lớn nhất dọc theo các hàng và cột, tương ứng.
    • Nếu bạn muốn lưu trữ giá trị trả về trong một mảng khác, bạn có thể đặt tham số ra tùy chọn cho mảng đầu ra. Tuy nhiên, mảng đầu ra phải có hình dạng và kiểu dữ liệu tương thích.

    Tiếp theo, hãy xem hướng dẫn chuyên sâu về các bộ Python.

    Chủ Đề