Всем доброго времени суток. Помогите, пожалуйста, с задачей…
Инициализировать массив n x n. n вводит пользователь. Найти максимальный элемент в массиве и его положение: номер строки, номер столбца.
Собственно, вот мои наработки, но не знаю как определить положение… Заранее спасибо!
C++ | ||
|
Замените 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).