I’m trying to find an elegant way to find the max value in a two-dimensional array.
for example for this array:
[0, 0, 1, 0, 0, 1] [0, 1, 0, 2, 0, 0][0, 0, 2, 0, 0, 1][0, 1, 0, 3, 0, 0][0, 0, 0, 0, 4, 0]
I would like to extract the value ‘4’.
I thought of doing a max within max but I’m struggling in executing it.
snakecharmerb
45.7k11 gold badges97 silver badges146 bronze badges
asked Nov 20, 2016 at 8:11
Another way to solve this problem is by using function numpy.amax()
>>> import numpy as np
>>> arr = [0, 0, 1, 0, 0, 1] , [0, 1, 0, 2, 0, 0] , [0, 0, 2, 0, 0, 1] , [0, 1, 0, 3, 0, 0] , [0, 0, 0, 0, 4, 0]
>>> np.amax(arr)
answered Jul 24, 2018 at 11:03
2
Max of max numbers (map(max, numbers)
yields 1, 2, 2, 3, 4):
>>> numbers = [0, 0, 1, 0, 0, 1], [0, 1, 0, 2, 0, 0], [0, 0, 2, 0, 0, 1], [0, 1, 0, 3, 0, 0], [0, 0, 0, 0, 4, 0]
>>> map(max, numbers)
<map object at 0x0000018E8FA237F0>
>>> list(map(max, numbers)) # max numbers from each sublist
[1, 2, 2, 3, 4]
>>> max(map(max, numbers)) # max of those max-numbers
4
answered Nov 20, 2016 at 8:13
falsetrufalsetru
354k63 gold badges720 silver badges631 bronze badges
Not quite as short as falsetru’s answer but this is probably what you had in mind:
>>> numbers = [0, 0, 1, 0, 0, 1], [0, 1, 0, 2, 0, 0], [0, 0, 2, 0, 0, 1], [0, 1, 0, 3, 0, 0], [0, 0, 0, 0, 4, 0]
>>> max(max(x) for x in numbers)
4
answered May 21, 2018 at 1:34
schmyschmy
1211 silver badge5 bronze badges
>>> numbers = [0, 0, 1, 0, 0, 1], [0, 1, 0, 2, 0, 0], [0, 0, 2, 0, 0, 1], [0, 1, 0, 3, 0, 0], [0, 0, 0, 0, 4, 0]
You may add key
parameter to max
as below to find Max value in a 2-D Array/List
>>> max(max(numbers, key=max))
4
answered Jun 7, 2021 at 2:22
afghaniafghani
3694 silver badges7 bronze badges
How about this?
import numpy as np
numbers = np.array([[0, 0, 1, 0, 0, 1], [0, 1, 0, 2, 0, 0], [0, 0, 2, 0, 0, 1], [0, 1, 0, 3, 0, 0], [0, 0, 0, 0, 4, 0]])
print(numbers.max())
4
cebe
3,5501 gold badge23 silver badges37 bronze badges
answered Apr 8, 2020 at 11:57
1
One very easy solution to get both the index of your maximum and your maximum could be :
numbers = np.array([[0,0,1,0,0,1],[0,1,0,2,0,0],[0,0,2,0,0,1],[0,1,0,3,0,0],[0,0,0,0,4,0]])
ind = np.argwhere(numbers == numbers.max()) # In this case you can also get the index of your max
numbers[ind[0,0],ind[0,1]]
answered Apr 1, 2021 at 14:57
MarkhMarkh
535 bronze badges
This approach is not as intuitive as others but here goes,
numbers = [0, 0, 1, 0, 0, 1], [0, 1, 0, 2, 0, 0], [0, 0, 2, 0, 0, 1], [0, 1, 0, 3, 0, 0], [0, 0, 0, 0, 4, 0]
maximum = -9999
for i in numbers:
maximum = max(maximum,max(i))
return maximum"
answered Jun 25, 2022 at 3:39
Помогите разобраться с задачкой.
Найдите индексы первого вхождения максимального элемента. Выведите два числа: номер строки и номер столбца, в которых стоит наибольший элемент в двумерном массиве. Если таких элементов несколько, то выводится тот, у которого меньше номер строки, а если номера строк равны то тот, у которого меньше номер столбца.
Программа получает на вход размеры массива n и m, затем n строк по m чисел в каждой.
Пример:
3 4
0 3 2 4
2 3 5 5
5 1 2 3
Я смог только вывести на экран полученный массив, дальше ступор.
Python | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Natalia Sashnikova. Двумерные массивы. Two-dimensional arrays. | |
# «Максимум двумерного массива» «Index of the greatest element of two-dimensional arrays». | |
# Найдите индексы первого вхождения максимального элемента. | |
# Выведите два числа: номер строки и номер столбца, в которых стоит наибольший элемент в двумерном массиве. | |
# Если таких элементов несколько, то выводится тот, у которого меньше номер строки, а если номера строк равны то тот, у которого меньше номер столбца. | |
#Программа получает на вход размеры массива n и m, затем n строк по m чисел в каждой. | |
nm = input().split() | |
n = int(nm[0]) | |
m = int(nm[1]) | |
max_i = 0 | |
max_j = 0 | |
a = [[int(j) for j in input().split()] for i in range(n)] | |
for i in range(0, n): # n=3 —— 0,1,2 | |
for j in range(0, m): # m=4 —-0,1,2,3 | |
if a[i][j] > a[max_i][max_j]: | |
max_i = i | |
max_j = j | |
print(max_i, max_j) |
В этом руководстве вы узнаете, как использовать функцию NumPy argmax() для поиска индекса максимального элемента в массивах.
NumPy — мощная библиотека для научных вычислений на Python; он предоставляет N-мерные массивы, которые более эффективны, чем списки Python. Одной из распространенных операций, которую вы будете выполнять при работе с массивами NumPy, является поиск максимального значения в массиве. Однако иногда вам может понадобиться найти индекс, при котором происходит максимальное значение.
Функция argmax() помогает найти индекс максимума как в одномерных, так и в многомерных массивах. Давайте продолжим изучать, как это работает.
Чтобы следовать этому руководству, вам необходимо установить Python и NumPy. Вы можете кодировать, запустив Python REPL или запустив блокнот Jupyter.
Во-первых, давайте импортируем NumPy под обычным псевдонимом np.
import numpy as np
Вы можете использовать функцию NumPy max(), чтобы получить максимальное значение в массиве (необязательно вдоль определенной оси).
array_1 = np.array([1,5,7,2,10,9,8,4]) print(np.max(array_1)) # Output 10
В этом случае np.max(array_1) возвращает 10, что правильно.
Предположим, вы хотите найти индекс, при котором в массиве встречается максимальное значение. Вы можете использовать следующий двухэтапный подход:
В array_1 максимальное значение 10 встречается в индексе 4 после нулевой индексации. Первый элемент имеет индекс 0; второй элемент имеет индекс 1 и так далее.
Чтобы найти индекс, при котором происходит максимум, вы можете использовать функцию NumPy where(). np.where(условие) возвращает массив всех индексов, где условие истинно.
Вам нужно будет подключиться к массиву и получить доступ к элементу по первому индексу. Чтобы найти, где находится максимальное значение, мы устанавливаем условие в array_1==10; напомним, что 10 — это максимальное значение в array_1.
print(int(np.where(array_1==10)[0])) # Output 4
Мы использовали np.where() только с условием, но это не рекомендуемый метод для использования этой функции.
📑 Примечание: функция NumPy where():
np.where(условие,x,y) возвращает:
– Элементы из x, когда условие истинно, и
– Элементы из y, когда условие имеет значение False.
Следовательно, объединяя функции np.max() и np.where(), мы можем найти максимальный элемент, за которым следует индекс, по которому он встречается.
Вместо описанного выше двухэтапного процесса вы можете использовать функцию NumPy argmax(), чтобы получить индекс максимального элемента в массиве.
Синтаксис функции NumPy argmax()
Общий синтаксис для использования функции NumPy argmax() выглядит следующим образом:
np.argmax(array,axis,out) # we've imported numpy under the alias np
В приведенном выше синтаксисе:
- array — любой допустимый массив NumPy.
- ось является необязательным параметром. При работе с многомерными массивами вы можете использовать параметр оси, чтобы найти индекс максимума по определенной оси.
- out — еще один необязательный параметр. Вы можете установить параметр out в массив NumPy для хранения вывода функции argmax().
Примечание. В NumPy версии 1.22.0 появился дополнительный параметр keepdims. Когда мы указываем параметр оси в вызове функции argmax(), массив уменьшается вдоль этой оси. Но установка для параметра keepdims значения True гарантирует, что возвращаемый результат имеет ту же форму, что и входной массив.
Использование NumPy argmax() для поиска индекса максимального элемента
№1. Давайте воспользуемся функцией NumPy argmax(), чтобы найти индекс максимального элемента в array_1.
array_1 = np.array([1,5,7,2,10,9,8,4]) print(np.argmax(array_1)) # Output 4
Функция argmax() возвращает 4, и это правильно! ✅
№ 2. Если мы переопределим array_1 таким образом, что 10 встречается дважды, функция argmax() вернет только индекс первого вхождения.
array_1 = np.array([1,5,7,2,10,10,8,4]) print(np.argmax(array_1)) # Output 4
В остальных примерах мы будем использовать элементы array_1, которые мы определили в примере №1.
Использование NumPy argmax() для поиска индекса максимального элемента в 2D-массиве
Давайте изменим массив NumPy array_1 в двумерный массив с двумя строками и четырьмя столбцами.
array_2 = array_1.reshape(2,4) print(array_2) # Output [[ 1 5 7 2] [10 9 8 4]]
Для двумерного массива ось 0 обозначает строки, а ось 1 — столбцы. Массивы NumPy следуют нулевой индексации. Таким образом, индексы строк и столбцов для массива NumPy array_2 следующие:
Теперь давайте вызовем функцию argmax() для двумерного массива array_2.
print(np.argmax(array_2)) # Output 4
Несмотря на то, что мы вызвали argmax() для двумерного массива, он по-прежнему возвращает 4. Это идентично выходным данным для одномерного массива array_1 из предыдущего раздела.
Почему это происходит? 🤔
Это потому, что мы не указали никакого значения для параметра оси. Если этот параметр оси не установлен, по умолчанию функция argmax() возвращает индекс максимального элемента в сглаженном массиве.
Что такое плоский массив? Если имеется N-мерный массив вида d1 x d2 x … x dN, где d1, d2, to dN — размеры массива по N измерениям, то сплющенный массив представляет собой длинный одномерный массив размера д1*д2*…*дН.
Чтобы проверить, как выглядит сглаженный массив для array_2, вы можете вызвать метод flatten(), как показано ниже:
array_2.flatten() # Output array([ 1, 5, 7, 2, 10, 9, 8, 4])
Индекс максимального элемента вдоль строк (ось = 0)
Перейдем к поиску индекса максимального элемента по строкам (ось = 0).
np.argmax(array_2,axis=0) # Output array([1, 1, 1, 1])
Этот вывод может быть немного сложным для понимания, но мы поймем, как он работает.
Мы установили параметр оси равным нулю (ось = 0), так как мы хотели бы найти индекс максимального элемента по строкам. Поэтому функция argmax() возвращает номер строки, в которой встречается максимальный элемент, — для каждого из трех столбцов.
Давайте визуализируем это для лучшего понимания.
Из приведенной выше диаграммы и вывода argmax() мы имеем следующее:
- Для первого столбца с индексом 0 максимальное значение 10 встречается во второй строке с индексом = 1.
- Для второго столбца с индексом 1 максимальное значение 9 встречается во второй строке с индексом = 1.
- Для третьего и четвертого столбцов с индексами 2 и 3 максимальные значения 8 и 4 встречаются во второй строке с индексом = 1.
Именно поэтому у нас есть выходной массив ([1, 1, 1, 1]), так как максимальный элемент по строкам приходится на вторую строку (для всех столбцов).
Индекс максимального элемента вдоль столбцов (ось = 1)
Далее воспользуемся функцией argmax(), чтобы найти индекс максимального элемента по столбцам.
Запустите следующий фрагмент кода и посмотрите на результат.
np.argmax(array_2,axis=1)
array([2, 0])
Можете ли вы разобрать вывод?
Мы установили ось = 1, чтобы вычислить индекс максимального элемента по столбцам.
Функция argmax() возвращает для каждой строки номер столбца, в котором встречается максимальное значение.
Вот визуальное объяснение:
Из приведенной выше диаграммы и вывода argmax() мы имеем следующее:
- Для первой строки с индексом 0 максимальное значение 7 встречается в третьем столбце с индексом = 2.
- Для второй строки с индексом 1 максимальное значение 10 встречается в первом столбце с индексом = 0.
Надеюсь, теперь вы понимаете, что такое вывод, массив([2, 0]) означает.
Использование необязательного параметра вывода в NumPy argmax()
Вы можете использовать необязательный параметр out the в функции NumPy argmax() для сохранения вывода в массиве NumPy.
Давайте инициализируем массив нулей для хранения вывода предыдущего вызова функции argmax() — для нахождения индекса максимума по столбцам (ось = 1).
out_arr = np.zeros((2,)) print(out_arr) [0. 0.]
Теперь давайте вернемся к примеру поиска индекса максимального элемента по столбцам (ось = 1) и установим значение out равным out_arr, которое мы определили выше.
np.argmax(array_2,axis=1,out=out_arr)
Мы видим, что интерпретатор Python выдает TypeError, так как out_arr по умолчанию был инициализирован массивом с плавающей запятой.
--------------------------------------------------------------------------- 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'
Поэтому при установке параметра out для выходного массива важно убедиться, что выходной массив имеет правильную форму и тип данных. Поскольку индексы массива всегда являются целыми числами, мы должны установить для параметра dtype значение int при определении выходного массива.
out_arr = np.zeros((2,),dtype=int) print(out_arr) # Output [0 0]
Теперь мы можем продолжить и вызвать функцию argmax() с параметрами оси и выхода, и на этот раз она выполняется без ошибок.
np.argmax(array_2,axis=1,out=out_arr)
Выходные данные функции argmax() теперь доступны в массиве out_arr.
print(out_arr) # Output [2 0]
Вывод
Я надеюсь, что это руководство помогло вам понять, как использовать функцию NumPy argmax(). Вы можете запустить примеры кода в блокноте Jupyter.
Давайте повторим то, что мы узнали.
- Функция NumPy argmax() возвращает индекс максимального элемента в массиве. Если максимальный элемент встречается в массиве a более одного раза, то np.argmax(a) возвращает индекс первого вхождения элемента.
- При работе с многомерными массивами вы можете использовать необязательный параметр оси, чтобы получить индекс максимального элемента по определенной оси. Например, в двумерном массиве: задав ось = 0 и ось = 1, можно получить индекс максимального элемента по строкам и столбцам соответственно.
- Если вы хотите сохранить возвращаемое значение в другом массиве, вы можете установить необязательный параметр out для выходного массива. Однако выходной массив должен иметь совместимую форму и тип данных.
Затем ознакомьтесь с подробным руководством по наборам Python.
Given a matrix, the task is to find the maximum element of each row.
Examples:
Input : [1, 2, 3] [1, 4, 9] [76, 34, 21] Output : 3 9 76 Input : [1, 2, 3, 21] [12, 1, 65, 9] [1, 56, 34, 2] Output : 21 65 56
Method 1: The idea is to run the loop for no_of_rows. Check each element inside the row and find for the maximum element. Finally, print the element.
Below is the implementation :
Python
import
numpy
def
maxelement(arr):
no_of_rows
=
len
(arr)
no_of_column
=
len
(arr[
0
])
for
i
in
range
(no_of_rows):
max1
=
0
for
j
in
range
(no_of_column):
if
arr[i][j] > max1:
max1
=
arr[i][j]
print
(max1)
arr
=
[[
3
,
4
,
1
,
8
],
[
1
,
4
,
9
,
11
],
[
76
,
34
,
21
,
1
],
[
2
,
1
,
4
,
5
]]
maxelement(arr)
Output :
8 11 76 5
Time Complexity: O(N^2), where N is the number of rows in the matrix.
Space Complexity: O(1), as no extra space is required for the algorithm.
Method 2: By calculating max element Each list of list of lists using the max() function
Python3
arr
=
[[
3
,
4
,
1
,
8
],
[
1
,
4
,
9
,
11
],
[
76
,
34
,
21
,
1
],
[
2
,
1
,
4
,
5
]]
for
i
in
arr:
print
(
max
(i))
Time complexity: O(n*m), where n is the number of rows and m is the number of columns in the matrix.
Auxiliary space: O(1), as we are only using a constant amount of extra space to store the maximum value of each row.
Another approach that could be used to find the maximum element of each row in a matrix is to use the built-in map() function. The map() function applies a given function to each element of a given iterable (such as a list or a matrix). In this case, we can use the map() function to apply the max() function to each row of the matrix.
Here is an example of how this approach could be implemented:
Python3
def
find_max_element(matrix):
return
list
(
map
(
lambda
row:
max
(row), matrix))
matrix
=
[[
3
,
4
,
1
,
8
],
[
1
,
4
,
9
,
11
],
[
76
,
34
,
21
,
1
],
[
2
,
1
,
4
,
5
]]
max_elements
=
find_max_element(matrix)
print
(max_elements)
Time complexity: O(n * m), where n is the number of rows and m is the number of columns in the matrix.
Auxiliary Space: O(n), as we are creating a new list to store the maximum elements of each row.
Method#4: Using the Recursive method.
The find_max_recursive function takes a matrix as input, along with an optional index variable i (which is initially set to 0) and a result list res (which is initially empty). The function returns a list of the maximum element in each row of the matrix.
The function first checks if it has reached the end of the matrix (i.e., if i is equal to the length of the matrix). If so, it returns the result list. Otherwise, it finds the maximum element in the current row using the built-in max function, and appends it to the result list. It then recursively calls itself with the index of the next row and the updated result list.
Python3
def
find_max_recursive(matrix, i
=
0
, res
=
[]):
if
i
=
=
len
(matrix):
return
res
max_val
=
max
(matrix[i])
res.append(max_val)
return
find_max_recursive(matrix, i
+
1
, res)
matrix
=
[[
3
,
4
,
1
,
8
],
[
1
,
4
,
9
,
11
],
[
76
,
34
,
21
,
1
],
[
2
,
1
,
4
,
5
]]
max_elements
=
find_max_recursive(matrix)
print
(max_elements)
The time complexity of this function is O(n^2), where n is the size of the input matrix. This is because the function iterates over each element in the matrix once to find the maximum value in each row, resulting in n iterations. Additionally, finding the maximum value in each row requires iterating over each element in the row, resulting in another n iterations. Therefore, the total number of iterations is n^2.
The auxiliary space of this function is also O(n^2), as the result array ‘res’ is being appended with the maximum element from each row in the matrix. Since the matrix has n^2 elements, the result array will also have a maximum of n^2 elements, leading to the O(n^2) space complexity.
Method#5: Using the lambda function + list comprehension
In this method, we define a lambda function that takes a matrix as input and uses a list comprehension to print the maximum element of each row using the NumPy max() function.
Note: Before using numpy you first need to install it by using the following command: pip install numpy
Below is the code for the following method:
Python3
import
numpy as np
maxelement
=
lambda
arr: [
print
(np.
max
(row), end
=
" "
)
for
row
in
arr]
arr
=
[[
3
,
4
,
1
,
8
],
[
1
,
4
,
9
,
11
],
[
76
,
34
,
21
,
1
],
[
2
,
1
,
4
,
5
]]
maxelement(arr)
Output:
Time complexity: O(n*m), where n is the number of rows and m is the number of columns in the matrix.
Auxiliary Space: O(1)
Please refer complete article on Find maximum element of each row in a matrix for more details!
Last Updated :
29 Mar, 2023
Like Article
Save Article