Làm thế nào để có được chỉ mục của một phần tử tối đa trong một mảng numpy dọc theo một trục


118

Tôi có một mảng NumPy 2 chiều. Tôi biết cách lấy các giá trị tối đa qua các trục:

>>> a = array([[1,2,3],[4,3,1]])
>>> amax(a,axis=0)
array([4, 3, 3])

Làm thế nào tôi có thể nhận được các chỉ số của các yếu tố tối đa? Vì vậy, tôi muốn như đầu raarray([1,1,0])

Câu trả lời:


141
>>> a.argmax(axis=0)

array([1, 1, 0])

1
điều này hoạt động tốt cho các số nguyên nhưng tôi có thể làm gì cho các giá trị float và các số từ 0 đến 1
Priyom saha 23/2/19

100
>>> import numpy as np
>>> a = np.array([[1,2,3],[4,3,1]])
>>> i,j = np.unravel_index(a.argmax(), a.shape)
>>> a[i,j]
4

11
Lưu ý rằng câu trả lời này là sai lệch. Nó tính toán chỉ số của phần tử tối đa của mảng trên tất cả các trục, không dọc theo một trục nhất định như OP yêu cầu: nó sai. Hơn nữa, nếu có nhiều hơn một mức tối đa, nó sẽ lấy các chỉ số của mức tối đa đầu tiên: điều này cần được chỉ ra. Hãy thử a = np.array([[1,4,3],[4,3,1]])để thấy rằng nó trả về i,j==0,1và bỏ qua giải pháp tại i,j==1,0. Đối với các chỉ số của tất cả các sử dụng tối đa thay thế i,j = where(a==a.max().
gg349

36

argmax()sẽ chỉ trả lại lần xuất hiện đầu tiên cho mỗi hàng. http://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html

Nếu bạn cần phải làm điều này cho một mảng có hình, điều này hoạt động tốt hơn unravel:

import numpy as np
a = np.array([[1,2,3], [4,3,1]])  # Can be of any shape
indices = np.where(a == a.max())

Bạn cũng có thể thay đổi điều kiện của mình:

indices = np.where(a >= 1.5)

Ở trên cung cấp cho bạn kết quả trong các hình thức mà bạn yêu cầu. Ngoài ra, bạn có thể chuyển đổi sang danh sách tọa độ x, y bằng cách:

x_y_coords =  zip(indices[0], indices[1])

2
Điều này không làm việc cho tôi ... Bạn có nghĩa là indices = np.where(a==a.max())trong dòng 3?
Atomh33ls

Bạn nói đúng, nguyên tử! Cảm ơn vì đã phát hiện ra điều đó. Tôi đã sửa câu lệnh đó để bao gồm dấu bằng thứ hai cho điều kiện thích hợp.
SevakPrime

@SevakPrime, đã có một lỗi thứ hai được chỉ ra bởi @ atomh33ls, .max()thay vì .argmax(). Vui lòng chỉnh sửa câu trả lời
gg349

@ gg349, nó phụ thuộc vào những gì bạn muốn. argmax cung cấp nó dọc theo một trục dường như là cách mà OP muốn nó đã chấp thuận câu trả lời đó của eumiro.
SevakPrime

Tôi thấy rằng hiệu chỉnh @ atomh33ls và tôi đề xuất dẫn đến chỉ số của (các) phần tử lớn nhất của mảng, trong khi OP đang hỏi về các phần tử lớn nhất dọc theo một trục nhất định. Tuy nhiên, lưu ý rằng giải pháp hiện tại của bạn dẫn đến x_y_coord = [(0, 2), (1, 1)]điều đó KHÔNG khớp với câu trả lời @eumiro và sai. Ví dụ: hãy thử a = array([[7,8,9],[10,11,12]])để thấy rằng mã của bạn không có bất kỳ cú đánh nào vào đầu vào này. Bạn cũng đề cập rằng điều này hoạt động tốt hơn unravel, nhưng giải pháp được đăng bởi @blas trả lời vấn đề tối đa tuyệt đối, không phải jsut dọc theo một trục.
gg349

3
v = alli.max()
index = alli.argmax()
x, y = index/8, index%8
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.