Tin tức và phân tích của tất cả các thiết bị di động

Làm cách nào để sử dụng hàm NumPy argmax() trong 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ỉ mục của phần tử lớn nhất trong mảng.

NumPy là một thư viện mạnh mẽ dành cho tính toán khoa học bằng Python; cung cấp mảng N chiều hiệu quả hơn danh sách python. Một trong những thao tác phổ biến mà 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ột mảng. Tuy nhiên, đôi khi bạn có thể muốn tìm chỉ mục có giá trị lớn nhất.

Hàm argmax() giúp bạn tìm chỉ số lớn nhất trong cả mảng một chiều và mảng nhiều chiều. Hãy xem cách nó hoạt động.

Cách tìm chỉ mục của phần tử tối đa trong mảng NumPy

Bạn phải cài đặt Python và NumPy để làm theo hướng dẫn này. Bạn có thể viết mã bằng cách chạy Python REPL hoặc bằng cách chạy sổ ghi chép Jupyter.

Trước tiên, hãy nhập NumPy dưới bí danh thông thường, ví dụ:

import numpy as np

Bạn có thể sử dụng hàm NumPy max() để lấy giá trị lớn nhất trong một mảng (tùy chọn dọc theo một trục đã chỉ định).

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, eg.max(array_1) trả về 10, giá trị này đúng.

Giả sử bạn muốn tìm chỉ mục nơi xảy ra giá trị lớn nhất trong một mảng. Bạn có thể sử dụng phương pháp 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 là 10 xảy ra tại chỉ mục 4, sau khi không lập chỉ mục. Mục đầu tiên có chỉ mục 0; phần tử thứ hai có một chỉ số 1 và như thế.

    Để 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(). ví dụ.where(condition) trả về một mảng gồm tất cả các chỉ mục có điều kiện đánh giá là True.

    Bạn sẽ cần chạm vào mảng và truy cập phần tử từ chỉ mục đầu tiên. Để biết giá trị lớn nhất xảy ra ở đâu, chúng ta đặt điều kiện thành 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 một điều kiện, nhưng đó không phải là phương pháp được đề xuất để sử dụng chức năng này.

    📑 Lưu ý: Hàm NumPy where():
    ví dụ: where(condition,x,y) trả về:

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

    Do đó, bằng cách kết hợp 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ỉ mục nơi 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ỉ mục của phần tử lớn nhất trong một mảng.

    Cú pháp hàm NumPy argmax()

    Cú pháp chung cho 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ố axis để tìm chỉ số lớn nhất dọc theo một trục cụ thể.
    • out 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 để giữ đầu ra của hàm argmax().

    Lưu ý: vì NumPy 1.22.0 có một tham số keepdims bổ sung. Khi chúng ta chỉ định một tham số trục trong lệnh gọi argmax(), mảng sẽ được giảm dọc theo trục đó. Tuy nhiên, đặt keepdims thành True đảm bảo rằng đầu ra được 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ử lớn nhất

    #1. Hãy sử dụng hàm NumPy argmax() để tìm chỉ mục của phần tử lớn nhất của 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đó là chính xác!

    #2. Nếu chúng ta xác định lại mảng_1 sao cho 10 xảy ra hai lần, thì argmax() chỉ trả về chỉ mục 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 các ví dụ còn lại, chúng ta sẽ sử dụng các phần tử của mảng_1 mà chúng ta đã xác định trong ví dụ 1.

    Sử dụng NumPy argmax() để tìm chỉ mục của phần tử lớn nhất trong mảng 2D

    Hãy định hình lại mảng NumPy_1 thành một mảng hai chiều có 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]]

    Trong trường hợp mảng hai chiều, trục 0 viết tắt của hàng và trục 1 viết tắt của cột. Mảng NumPy tuân theo chỉ mục null. Vì vậy, các chỉ mục hàng và cột cho mảng NumPy_2 như sau:

    Bây giờ, hãy gọi hàm argmax() trên mảng hai chiều_2.

    print(np.argmax(array_2))
    
    # Output
    4

    Mặc dù chúng ta đã gọi argmax() trên mảng hai chiều nhưng nó vẫn trả về 4. Điều này giống hệt với kết quả cho mảng một chiều array_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ị tham số trục nào. Khi tham số trục này không được đặt, theo mặc định, argmax() trả về chỉ mục của phần tử lớn nhất dọc theo mảng được làm phẳng.

    Một mảng phẳng là gì? Nếu tồn tại một mảng N chiều có dạng d1 x d2 x … x dN, trong đó d1, d2, dN là các kích thước của mảng theo N chiều thì mảng phẳng là mảng một chiều có kích thước dài d1*d2*…*dN.

    Để kiểm tra mảng được làm 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ư bên dưới:

    array_2.flatten()
    
    # Output
    array([ 1,  5,  7,  2, 10,  9,  8,  4])

    Chỉ số của phần tử tối đa dọc theo các hàng (trục = 0)

    Hãy chuyển sang 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])

    Kết quả này có thể hơi khó hiểu, nhưng chúng ta sẽ hiểu nó hoạt động như thế nào.

    Chúng tôi đặt tham số trục thành 0 (trục = 0) bởi vì chúng tôi muốn tìm chỉ mục của phần tử tối đa dọc theo các hàng. Do đó, hàm argmax() trả về số hàng có phần tử lớn nhất cho mỗi trong ba cột.

    Hãy hình dung nó để 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 có chỉ mục 0 giá trị tối đa là 10 xảy ra ở hàng thứ hai, với chỉ số = 1.
    • Đối với cột thứ hai có chỉ mục 1 gia trị lơn nhât 9 xảy ra ở dòng thứ hai, với chỉ số = 1.
    • Đối với cột thứ ba và thứ tư có chỉ mục 2 và 3 giá trị tối đa 8 và 4 xuất hiện ở hàng thứ hai, với chỉ số = 1.

    Đó 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 (đối với tất cả các cột).

    Chỉ số của phần tử tối đa dọc theo các cột (trục = 1)

    Sau đó, hãy sử dụng hàm argmax() để tìm chỉ mục 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 trục = 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 nơi 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 tại chỉ mục 0 gia trị lơn nhât 7 xảy ra trong cột thứ ba, với chỉ số = 2.
    • Ở hàng thứ hai về chỉ số 1 giá trị tối đa là 10 xảy ra 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 là gì, một mảng ([2, 0]) có nghĩa.

    Sử dụng tham số out tùy chọn trong NumPy argmax()

    Bạn có thể sử dụng tham số out 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 trước đó tới argmax() – để tìm chỉ số tối đa dọc theo các cột (axis=1).

    out_arr = np.zeros((2,))
    print(out_arr)
    [0. 0.]

    Bây giờ chúng ta quay lại ví dụ tìm chỉ số lớn nhất của một phần tử dọc theo các cột (axis = 1) và đặt thành out_arr mà chúng tôi đã xác định ở trên.

    np.argmax(array_2,axis=1,out=out_arr)

    Chúng tôi thấy rằng trình thông dịch Python ném TypeError vì out_arr được khởi tạo dưới dạng 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ột mảng đầu ra, điều quan trọng là phải đả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ì các chỉ số mảng luôn là số nguyên, nê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 argmax() với các tham số axis và out, và lần này nó hoạt động hoàn hảo.

    np.argmax(array_2,axis=1,out=out_arr)

    Đầu ra của hàm argmax() hiện có sẵn trong mảng out_arr.

    print(out_arr)
    # Output
    [2 0]

    Đăng kí

    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 những gì chúng ta đã học được.

    • Hàm NumPy argmax() trả về chỉ số của phần tử lớn nhất trong một mảng. Ví dụ: nếu phần tử lớn nhất xuất hiện nhiều lần trong mảng a, 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ử lớn nhất dọc theo một trục xác định. Ví dụ: trong mảng hai chiều: bằng cách đặt axis = 0 và trục = 1bạn có thể lấy chỉ số của phần tử lớn nhất dọc theo hàng và cột tương ứng.
    • Nếu bạn muốn lưu trữ giá trị được trả về trong một mảng khác, bạn có thể đặt tham số out tùy chọn thành một mảng đầu ra. Tuy nhiên, mảng đầu ra phải khớp với hình dạng và kiểu dữ liệu.

    Sau đó, hãy xem hướng dẫn chi tiết về tập hợp python.