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

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

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

Инициализировать массив 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;
}

Замените li на Ваш список:

import random

li = [[random.randint(10, 99) for i in range(6)] for j in range(5)]

print('Список:', *li, sep='n', end='nn')

max_el = li[0][0]
max_i = (0, 0)
for i in range(len(li)):
    for j in range(len(li[i])):
        x = li[i][j]
        if x > max_el:
            max_el = x
            max_i = (i, j)

print('Максимальный элемент: {}  # {}'.format(max_i, li[max_i[0]][max_i[1]]), end='')

Один из возможных stdout:

Список:
[64, 84, 44, 77, 50, 71]
[49, 28, 99, 97, 21, 38]
[21, 89, 40, 91, 15, 17]
[97, 28, 20, 84, 34, 32]
[69, 62, 51, 31, 91, 83]

Максимальный элемент: (1, 2)  # 99

В этом руководстве вы узнаете, как использовать функцию 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.

    Изучаю С++ по 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;
    };

    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).

    Понравилась статья? Поделить с друзьями:
  • Как найти фактически отработанное время формула
  • Как найти свой институт
  • Как найти максимум среди вводимых чисел
  • No pyvenv cfg file pycharm как исправить
  • Как найти прошедшее время в предложении