Как найти максимальный элемент в двумерный массив

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.6k11 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 badges719 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

3494 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

В общем, я вот так записала программу но что- то в ней не то, потому что она не максимальный выводит
var a:array[1..10,1..5] of integer;
i,j,max:integer;
begin
randomize;
for i:=1 to 10 do
begin
for j:=1 to 5 do
begin
a[i,j]:=random(50);
write(a[i,j]:4);
end;
writeln;
end;

for i:=1 to 10 do
max:=a[i,1];
begin

for j:=1 to 5 do

begin
if a[i,j]>max then max:=a[i,j];
end;
writeln(‘max=’,max);
end;
writeln;
end.

Все равно что то не то. Вот какой ответ получаем в результате программы (см. ниже)
20 30 33 46 22
27 22 32 23 31
0 21 43 34 30
16 41 24 2 46
36 10 46 18 24
46 4 23 7 25
0 36 36 27 10
14 10 39 41 33
21 40 42 4 47
47 41 35 14 7
max=46
max=46
max=46
max=46
max=46
max=46
max=46
max=46
max=47
max=47.Есть еще у кого нибудь варианты?

А нет все все спссибо та прога правильна просто надо было вывод поставить перед последним эндом!!)))

Программа ввода и вывода элементов массива может выглядеть следующим образом:

program z1;
const nm=10; mm=10;
type mas=array[1..nm,1..mm] of real;
var a:mas;
i,j,n,m:integer;

procedure zap(var a:mas);
var i,j:integer;
begin
assign(input,’input.txt’);
reset(input);
readln(n,m);
for i:=1 to n do
for j:=1 to m do
read(a[i,j]);
close(input);
end;

procedure vyv( a:mas);
var i,j:integer;
begin
assign(output,’output.txt’);
rewrite(output);
for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j]:8:2);
writeln;
end;
close(output);
end;

begin
zap(a);
vyv(a);
end.


Сохраните программу в файл и используйте как шаблон для решения задач с двумерным массивом.


Задания

Задание 1. Найти максимальный элемент массива и его номера. Элементы могут повторяться.

Указание: Поиск максимального элемента в двумерном массиве осуществляется таким же образом, как и в линейном массиве: предполагают, что максимальный – это первый элемент, затем максимальный сравнивается со следующим элементом, и если максимальный окажется меньше, то заменяем его значение.

Формат ввода:
В первой строке вводятся числа n и m – количество строк и столбцов массива
В следующих строках находятся элементы массива построчно

Формат вывода:
В первой строке – максимальный элемент
Во второй и следующих строках номер строки и номер столбца максимального элемента



      Тесты                 Посмотреть решение        

Экспериментальный раздел

1. Найти минимальный элемент массива и его номера. Элементы могут повторяться.
2. Найти минимальный элемент среди элементов главной и побочной диагоналей.


Задание 2. Найти количество отрицательных элементов в каждой строке.

Указание: количество элементов каждой строки хранить в одномерном массиве соответствующей размерности.

Формат ввода:
В первой строке вводятся числа n и m – количество строк и столбцов массива
В следующих строках находятся элементы массива построчно

Формат вывода:
В строку записаны числа – количества отрицательных элементов в каждой строке


        Тесты                Посмотреть решение         

Экспериментальный раздел

1. Найти количество кратных 5 элементов в каждой строке.
2. Найти количество кратных 5 и 2 элементов в каждой строке.
3. Найти количество кратных 5 или 2 элементов в каждой строке.
4. Найти количество отрицательных элементов в каждом столбце.


Задание 3. Дан двумерный массив А, состоящий из n x m вещественных чисел. Известно, что среди его элементов только два равны между собой. Напечатать их индексы.
Указание: Для просмотра первого элемента использовать циклы по переменным i и j, для просмотра второго элемента использовать циклы по переменным  i1 и j1.
Сравниваем a[i,j] c a[i1,j1]. Для исключения просмотра одного и того же элемента проверить условие (not((i=i1) and (j=j1))).

Формат ввода:
В первой строке вводятся числа n и m – количество строк и столбцов массива
В следующих строках находятся элементы массива построчно

Формат вывода:

В первой строке – индексы первого из равных элементов
Во второй строке – индексы второго из равных элементов



            Тесты       Посмотреть решение          


Задание 4. Определить, является ли данный квадратный массив симметричным относительно своей главной диагонали.

Указание: В задачах подобного типа необходимо увидеть зависимость между индексами элементов массива.

Если массив является симметричным, то для него выполняется равенство

 A[i, j]=A[j, i] для всех i=1..n и j=1..n.


Формат ввода:
В первой строке вводится число n – количество строк и столбцов массива
В следующих строках находятся элементы массива построчно

Формат вывода:
вывести YES или NO



          Тесты               
Посмотреть решение          

Экспериментальный раздел

1. Определить, является ли данный квадратный массив симметричным относительно своей побочной диагонали.


Задание 5. В массиве размерностью NxM к элементам четных столбцов прибавить элемент первого столбца соответствующей строки.

Указание: рассматриваем только четные столбцы и к элементу первой строки прибавляем a[1,1], к элементу второй строки прибавляем a[2,1] и т.д.


Формат ввода:
В первой строке вводятся числа n и m – количество строк и столбцов массива
В следующих строках находятся элементы массива построчно

Формат вывода:

Построчно элементы преобразованного массива

          Тесты             Посмотреть решение         

Экспериментальный раздел

1. В массиве размерностью NxM к элементам четных строк прибавить элемент первой строки соответствующего столбца.
2. К нечетным элементам прибавить соответствующие по строке элементы главной диагонали.


Задание  6. Заполнить массив А размером NxM “змейкой” следующим образом:

1

2

3

4

5

6

7

14

13

12

11

10

9

8

15

16

17

18

19

20

21

28

27

26

25

24

23

22

Указание: Для того, чтобы заполнить, надо вывести правило заполнения:

·         если строка нечетная, то   A[i,j]=(i-1)*m+j;

·         если строка четная, то     A[i,j]=i*m-j+1.



Формат вывода
Вывести построчно элементы массива

     Посмотреть решение          

Экспериментальный раздел

1. Заполнить массив размером m x n змейкой, начиная с последнего элемента.

22

23

24

25

26

27

28

21

20

19

18

17

16

15

8

9

10

11

12

13

14

7

6

5

4

3

2

1


Задания для самостоятельного решения

1. Заменить все отрицательные элементы на противоположные.

2. Дан массив  D(6,5). Выведите его на экран в виде таблицы.  Найдите и выведите  количество элементов больших среднего арифметического всех его элементов.

3. Заполнить массив А размером NxM следующим образом:

21

20

19

18

17

16

15

8

9

10

11

12

13

14

7

6

5

4

3

2

1


Тест


I am trying to find min (by row) and max (by column) element in two-dimensional (4,4) array and then store them in new array (5,5).

That is how it should look for new array (5,5):

1 2 3 4 min
5 6 7 8 min
4 4 4 5 min
3 5 5 6 min
m m m m  0

*m – max

Here it is the entire code:

#include <iostream>
using namespace std;
int main() {
    int A[4][4];/*First array*/
    int i, j;


    for (i = 0; i < 4; i++)
        for (j = 0; j < 4; j++) {
            cout << "n A[" << i + 1 << "][" << j + 1 << "]=";
            cin >> A[i][j];
        }

    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4; j++)
            cout << A[i][j] << "t";

        cout << "n";
    }
    {
        int min[4];/* find min on each row*/
        for (i = 0; i < 4; i++) {
            min[i] = A[0][i];
            for (j = 1; j < 4; j++) {
                if (min[i] > A[i][j])
                    min[i] = A[i][j];
            }
        }
        int newarr[5][5];/* here i create the new array 5,5)*/
        int max[5] = { 1,2,3,4,5 };
        for (i = 0; i < 4; i++) {
            for (j = 0; j < 4; j++) {
                newarr[i][j] = A[i][j];
                newarr[i][5] = max[i];
            }
        }

        for (j = 0; j < 4; j++)
            newarr[5][j] = min[j];
        cout << newarr[5][j] << "t";
        cout << "n";
}

}

I put random elements to max. Because so far I only test. But once I started my program it show correct only the first array. And where should be the new array it shows zero. Here it is the outcome of the debugging:

5   4   3   1   
5   6   7   9   
4   2   3   9   
4   8   4   6   
0   

How to fix it?
And how to put zero in the last element (as you can see in the first table for the new array).

Обработка двумерных массивов позволяет получить какие-то результаты путем анализа данных в массиве. Сам массив при этом не изменяется. Задачи поиска элементов, удовлетворяющих условию, подсчета суммы, поиска максимального и др. во многом решаются аналогично тому, как это происходило для линейных массивов.

Пример 15.8. Задан двумерный массив d из m строк и n столбцов. Посчитать сумму тех элементов массива, у которых сумма квадратов номера строки и номера столбца равна заданному числу x.

Этапы выполнения задания

I.  Исходные данные: переменные m и n (количество строк и столбцов в массиве), d — двумерный массив, x (число).

II.  Результат: переменная s (сумма искомых элементов).

III. Алгоритм решения задачи.

1. Ввод исходных данных. Массив вводится поэлементно. 
2. Определение начального значения для суммы (s = 0)
3. Проверяем текущий элемент. Если он удовлетворяет условию, то добавляем его к сумме. 
4. Вывод результата.

IV. Описание переменных: n, x, s – int, d – vector<vector <int>>

Пример 15.9. Задан двумерный массив d из m сток и n столбцов. Определить, есть ли в массиве хотя бы один элемент, кратный x. Если да, то вывести индексы его местоположения.

Этапы выполнения задания

I. Исходные данные: переменные m и n (количество строк и столбцов в массиве), d — двумерный массив, x (число).

II. Результат: переменные r, c (номера строки и столбца, в которых найден элемент) или сообщение «не найден».

III. Алгоритм решения задачи.

1. Ввод исходных данных. Массив заполняется случайными числами. 
2. Определение начального значения для искомых индексов (r = -1, c = -1). 
3. Проверка текущего элемента. Если он удовлетворяет условию, то меняем значения r и c. 
4. Вывод результата. Если переменные r и c не изменились, то выводим сообщение, что элемент не найден, иначе выводим их значения.

IV. Описание переменных: n, x, r, c – int, d – vector<vector <int>>

Если в массиве несколько элементов, удовлетворяющих условию задачи, то будет выведен последний найденный элемент. Если нужен первый элемент, то можно ввести дополнительную переменную-флаг, которая будет равна true, пока значения r и c не изменились. После их изменения она станет false и значения r и c больше меняться не будут (пример 15.10).

Пример 15.11. Задан двумерный массив d из m строк и n столбцов. Найти минимальный и максимальный элементы и вывести индексы их местоположения.

Этапы выполнения задания

I. Исходные данные: переменные m и nколичество строк и столбцов в массиве, d — двумерный массив, x — число.

II. Результат: переменные r_min, c_min, r_max, c_max — номера строки и столбца, в которых найден элемент.

III. Алгоритм решения задачи.

1. Ввод исходных данных. Массив заполняется случайными числами.
2. 
Определение начального значения для искомых индексов (r_min = 0, c_min = 0, r_max = 0, c_max = 0).
3. 
Проверяем текущий элемент. Если он больше текущего максимального, то меняем значения r_max, c_max.
4. 
Проверяем текущий элемент. Если он меньше текущего минимального, то меняем значения r_min, c_min.
5. 
Вывод результата.

IV. Описание переменных: n, m, n_min, c_min, r_max, c_max – int, d – vector<vector <int>>

Если в массиве несколько элементов, равных максимальному (минимальному), то будет выводиться местоположение первого из таких элементов. Если нужно получить местоположение последнего, то достаточно заменить знак «>» («<») на «>=» («<=»).

Пример 15.8.

V. Программа:

#include <iostream>

#include <vector>

using namespace std;

int main()

{

  int m, n;

  cout << “kol-vo strok m=”;

  cin >> m;

  cout << “kol-vo stolbcov n=”;

  cin >> n;

  cout << “elementy” << endl;

  vector <vector <int>> d(m, vector <int> (n));

  for (int i = 0; i < m; i++)

    for (int j = 0; j < n; j++)

      cin >> d[i][j];

  int x;

  cout << “x = “;

  cin >> x;

  int s = 0;

  for (int i = 0; i < m; i++)

    for (int j = 0; j < n; j++)

      if (* i + j * j == x)

        s += d[i][j];

  cout << “summa = “ << s << endl;

  return 0;

}

 VI. Тестирование.

VII. Анализ результатов. Будут просуммированы элементы, имеющие номера [1][2] и [2][1] (они выделены).

В математике для матрицы определены понятия главная диагональ и побочная диагональ. На главной диагонали находятся элементы матрицы d[i][j], для которых верно условие i = j. Для элементов побочной диагонали: i + j = n – 1 (n — число столбцов, нумерация с 0).

Пример 15.9.

V. Программа:

#include <iostream>

#include <vector>

#include <ctime>

#include <cstdio>

using namespace std;

int main()

{

  srand(time(NULL));

  int m, n;

  cout << “kol-vo strok m=”;

  cin >> m;

  cout << “kol-vo stolbcov n=”;

  cin >> n;

  cout << “elementy” << endl;

  vector <vector <int>> d(m, vector <int> (n));

  for (int i = 0; i < m; i++){

    for (int j = 0; j < n; j++){

      d[i][j] = rand() % 100;

      cout << d[i][j] << ” “;

    }

    cout << endl;

  }

  int x;

  cout << “x = “;

  cin >> x;

  int r = 1, c = 1;

  for (int i = 0; i < m; i++)

    for (int j = 0; j < n; j++)

      if (d[i][j] % x == 0){

        r = i;

        c = j;

      }

  if (== 1 && c == 1)

    cout << “ne naiden”;

  else {

    cout << d[r][c];

    cout << ” naiden na meste “;

    cout << r << ” “ << c;

  }

  cout << endl;

  return 0;

}

 VI. Тестирование.

Пример 15.10. Фрагмент программы:

bool f = true;

for (int i = 0; i < m; i++)

  for (int j = 0; j < n; j++)

    if (&& d[i][j] % x == 0){

      r = i;

      c = j;

       = false;

    }

Пример 15.11.

V. Программа:

#include <iostream>

#include <vector>

#include <ctime>

#include <cstdio>

using namespace std;

int main()

{

  srand(time(NULL));

  int m, n;

  cout << “kol-vo strok m=”;

  cin >> m;

  cout << “kol-vo stolbcov n=”;

  cin >> n;

  cout << “elementy” << endl;

  vector <vector <int>> d(m, vector <int> (n));

  for (int i = 0; i < m; i++){

    for (int j = 0; j < n; j++){

      d[i][j] = rand() % 100;

      cout << d[i][j] << ” “;

    }

    cout << endl;

  }

  int r_min = 0, c_min = 0;

  int r_max = 0, c_max = 0;

  for (int i = 0; i < m; i++){

    for (int j = 0; j < n; j++){

      if (d[i][j] > d[r_max][c_max]){

       r_max = i;

       c_max = j;

     }

     if (d[i][j] < d[r_min][c_min]){

       r_min = i;

       c_min = j;

    }

  }

  cout << “max = “ << d[r_max][c_max];

  cout << ” naiden na meste “;

  cout << r_max << ” “ << c_max;

  cout << endl;

  cout << “min = “ << d[r_min][c_min];

  cout << ” naiden na meste “;

  cout << r_min << ” “ << c_min;

  cout << endl;

  return 0;

}

 VI. Тестирование.

Добавить комментарий