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.8k11 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 x n. n вводит пользователь. Найти максимальный элемент в массиве и его положение: номер строки, номер столбца.
Собственно, вот мои наработки, но не знаю как определить положение… Заранее спасибо!
C++ | ||
|
Изучаю С++ по purecodecpp.com/archives/1158 и нашел задачку в комментариях, которую не могу решить.
Массив заполнил, разделил на одномерные и тут заглох, не знаю как найти наибольшее число.
Вот сам код с условием.
/*
В метании молота состязается n спортcменов. Каждый из них сделал m бросков.
Победителем соревнований объявляется тот спортсмен, у которого максимален наилучший результат по всем броскам.
Таким образом, программа должна найти значение максимального элемента в данном массиве,
а также его индексы (то есть номер спортсмена и номер попытки).
Входные данные
Программа получает на вход два числа n и m, являющиеся числом строк и столбцов в массиве.
Далее во входном потоке идет n строк по m чисел, являющихся элементами массива.
Выходные данные
Программа выводит значение максимального элемента, затем номер строки и номер столбца,
в котором он встречается. Если в массиве несколько максимальных элементов,
то нужно вывести минимальный номер строки, в которой встречается такой элемент,
а если в этой строке таких элементов несколько, то нужно вывести минимальный номер столбца.
Не забудьте, что все строки и столбцы нумеруются с 0.
*/
#include "stdafx.h"
#include <iostream>
#include <string>
#include <ctime>
#include <iomanip> // setw(отступ)
using namespace std;
int main() {
setlocale(0, "");
srand(time(NULL));
const int ROWSIZE = 3;
const int COLSIZE = 3;
int arr[ROWSIZE][COLSIZE] = {};
// заполнение массива с клавиатуры
/*
for (int rowNum = 0; rowNum < ROWSIZE; rowNum++) {
for (int colNum = 0; colNum < COLSIZE; colNum++) {
cout << "Пожалуйста, введите исходные значения массива: ";
cout << rowNum + 1 << "-я строка ";
cout << colNum + 1 << "-я колонка ";
cin >> arr[rowNum][colNum];
}
}
*/
// Заполняем массив случайными числами
for (int rowNum = 0; rowNum < ROWSIZE; rowNum++) {
cout << "Строка " << rowNum + 1 << ": ";
for (int colNum = 0; colNum < COLSIZE; colNum++) {
arr[rowNum][colNum] = 1 + rand() % 9;
cout << setw(2) << arr[rowNum][colNum];
}
cout << endl;
}
// Разделяем двумерный массив на одномерные
int row[ROWSIZE]{};
int col[COLSIZE]{};
for (int r = 0; r < ROWSIZE; r++) {
row[r] = arr[r - 1][COLSIZE];
cout << row[r] << "|";
for (int c = 0; c < COLSIZE; c++) {
col[c] = arr[c][r];
//cout << col[c] << "|" << endl;
}
}
system("pause");
return 0;
};
PHP already offers a native recursive function to traverse all leaf nodes of a multidimensional array called array_walk_recursive(). This offers a clean, concise, intuitive line of code. When future developers look at your code, they will know immediately what your line of code is trying to achieve without following multiple lines of code and logic. This will enable better maintainability and show that you know a direct tool for the task at hand.
After establishing a base or default value for $max
, you write a user-defined function (or «closure») that handles the conditional logic. The fiddly thing about closures is that they have their own «scope» — this means that the variables within are not available outside of the function (at least, not without help). global
declarations are generally inadvisable (in many cases a bad habit, and the line will be read on each iteration) even though they are well-intentioned, so use()
will serve as the means to import the variable and &
(which makes the variable «modifiable by reference») will serve as a means to export the variable from function scope back to the global scope.
Code: (Demo)
$ar3 = array(123, array(12, 665, array(77, 255, 98, 56), 8), 1155, 676);
$max = null; // declare a non-integer or minimum value here
array_walk_recursive($ar3, function($v)use(&$max){if($max === null || $v > $max) $max = $v;});
echo $max; // output: 1155
*array_walk_recursive()
returns true
or false
. You cannot use return
inside the closure to move $max
to the global scope.
*If you are going to initially declare $max
as 0
(because you don’t expect negative values), then you won’t need the $max === null
check in your conditional expression.
*If you are processing excessively deep multi-dimensional arrays (like hundreds of levels), then it is possible that a stack crash could occur. I tried to find a reference for this claim, but I can’t find a link anywhere — I did read it somewhere though.
1.
В соревнованиях по плаванию принимали
участие 5 спортсменов. Соревнования
состояли из 3 заплывов. Результаты
заплывов записали в таблицу размерностью
3х5. Получить одномерный массив размером
3, элементами которого будут лучшие
результаты в каждом из заплывов.
USES
Crt;
VAR
RZ:ARRAY[0..3,0..5]
OF INTEGER; LR:ARRAY[0..3] OF INTEGER;
I,J:BYTE;
BEGIN
ClrScr;
WriteLn;
{
Заполнение
таблицы
}
FOR
I:=1 TO 3 DO Begin
WriteLn(‘
Введите результаты ‘,I,’ заплыва’);
FOR
J:=1 TO 5 DO Begin
Write(J,’
участник
— ‘); ReadLn(RZ[I,J]);
End;
End;
WriteLn;
{
Определение лучшего результата в каждом
из заплывов }
FOR
I:=1 TO 3 DO Begin
LR[I]:=RZ[I,1];
FOR
J:=2 TO 5 DO
IF
RZ[I,J]<LR[I] THEN LR[I]:=RZ[I,J];
WriteLn(‘
Лучший результат ‘,I,’ заплыва = ‘,LR[I]);
End;
END.
2.
Дан двумерный массив размерностью 5х6,
заполненный целыми числами. Сформировать
одномерный массив, каждый элемент
которого равен наибольшему по модулю
элементу соответствующего столбца.
USES
Crt;
VAR
M:ARRAY[0..5,0..6]
OF INTEGER; MAX:ARRAY[0..6] OF INTEGER;
I,J:BYTE;
BEGIN
ClrScr;
Randomize;
WriteLn(‘
Значения элементов двумерного массива’);
FOR
I:=1 TO 5 DO Begin
FOR
J:=1 TO 6 DO Begin
M[I,J]:=Random(20)-8;
Write(M[I,J]:3);
End;
WriteLn;
End;
WriteLn;
{
Формирование одномерного массива}
WriteLn(‘
Значения элементов одномерного массива’);
FOR
J:=1 TO 6 DO Begin
MAX[J]:=ABS(M[1,J]);
FOR
I:=2 TO 5 DO
IF
ABS(M[I,J]) > MAX[J] THEN MAX[J]:=ABS(M[I,J]);
Write(MAX[J]:3);
End;
END.
3.
Дан двумерный массив размерностью NхM,
заполненный случайным образом.
Определить, есть ли в данном массиве
строка, в которой имеется два элемента
массива, имеющие наибольшее значение.
USES
Crt;
CONST
N=6; M=8;
VAR
A:ARRAY[0..N,0..M]
OF INTEGER;
I,J,K,FL:BYTE;
MAX:INTEGER;
BEGIN
ClrScr;
Randomize;
{
Заполнение двумерного массива случайным
образом и вывод в виде прямоугольной
матрицы }
WriteLn(‘
Значения элементов двумерного массива’);
FOR
I:=1 TO N DO Begin
FOR
J:=1 TO M DO Begin
A[I,J]:=Random(20);
Write(A[I,J]:3);
End;
WriteLn;
End;
WriteLn;
{
Нахождение наибольшего значения }
MAX:=A[1,1];
FOR
I:=1 TO N DO
FOR
J:=1 TO M DO
IF
A[I,J]>MAX THEN MAX:=A[I,J];
WriteLn(‘
Максимальное значение = ‘,MAX);
{
Нахождение строки, в которой два элемента
имеют наибольшее значение }
FL:=0;
FOR
I:=1 TO N DO Begin
K:=0;
FOR
J:=1 TO M DO
IF A[I,J]=MAX THEN Inc(K);
IF
K=2 THEN Begin WriteLn(‘В ‘,I,’ строке два элемента
имеют наибольшее значение’);
FL:=1;
End;
End;
IF
FL=0 THEN WriteLn(‘ Нет строк, в которых два
элемента имеют наибольшее значение’);
END.
Примеры
для самостоятельного решения:
Дан
двумерный массив размерностью 5×7,
заполненный случайным образом. Найти
наименьший и наибольший элементы
двумерного массива, поменять их местами.
Дан
двумерный массив размерностью NxM,
заполненный случайным образом. Получить
одномерный массив, элементами которого
являются сумма наименьшего и наибольшего
элементов соответственной строки
двумерного массива..