Как найти наибольшее значение в двумерном массиве

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's user avatar

snakecharmerb

45.8k11 gold badges97 silver badges146 bronze badges

asked Nov 20, 2016 at 8:11

Shuki's user avatar

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

Khan Saad Bin Hasan's user avatar

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

falsetru's user avatar

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

schmy's user avatar

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

afghani's user avatar

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's user avatar

cebe

3,5501 gold badge23 silver badges37 bronze badges

answered Apr 8, 2020 at 11:57

Gurami's user avatar

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

Markh's user avatar

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

EdwardFunnyHands's user avatar

Студворк — интернет-сервис помощи студентам

Всем доброго времени суток. Помогите, пожалуйста, с задачей…

Инициализировать массив n x n. n вводит пользователь. Найти максимальный элемент в массиве и его положение: номер строки, номер столбца.

Собственно, вот мои наработки, но не знаю как определить положение… Заранее спасибо!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
using namespace std;
int main()
{
int n, count=0, sum=0, b=0, max=0, str, stl;
float d;
 
cout<<"Vvedite kol-vo elementov po gorizontali, po vertikali:n";
cin>>n;
int Mas[n][n];
for (int i=0; i<n; i++)//Заполнение масива
    {
        for (int j=0; j<n; j++)
        {
            Mas[i][j]=rand()%100;
        }
    }
 
for (int i=n-1; i>=0; i--)//Вывод масива на экран
    {     
        cout<<endl; 
        for (int j=0; j<n; j++ )                
        { 
            cout<<Mas[i][j]<<"t";
        }   
        cout<<"n";     
    }
 
for (int i=0; i<n; i++)//Нахождение максимального элемента и его положения
{
    for (int j=0; j<n; j++)
    {
        
        if (Mas[i][j]>max)
        {
            max=Mas[i][j];
        }
        str=i+1;
        stl=j+1;
    }
}
cout<<"nMaximum: "<<max<<" Raspolojen v "<<str<<" stroke, stolbze "<<stl;
return 0;
}

Изучаю С++ по 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,
заполненный случайным образом. Получить
одномерный массив, элементами которого
являются сумма наименьшего и наибольшего
элементов соответственной строки
двумерного массива..

Понравилась статья? Поделить с друзьями:
  • Ведьмак 3 как найти ведьмачье снаряжение
  • Как найти скорость звука зная частоту
  • Как найти источник процесса
  • Как можно найти своих сослуживцев
  • Как найти друга по координатам в майнкрафт