In native Python, min
and max
have key functions:
>>> LoT=[(1, 2), (3, 4), (5, 6), (7, 8)]
>>> min(LoT, key=sum)
(1, 2)
>>> max(LoT, key=sum)
(7, 8)
If you want the index of the first min or max in Python, you would do something like:
>>> min(((i, t) for i, t in enumerate(LoT)), key=lambda (i,x): sum(x))
(0, (1, 2))
And then peel that tuple apart to get what you want. You also could use that in numpy, but at unknown (to me) performance cost.
In numpy, you can do:
>>> a=np.array(LoT)
>>> a[a.sum(axis=1).argmin()]
array([1, 2])
>>> a[a.sum(axis=1).argmax()]
array([7, 8])
To get the index only:
>>> a.sum(axis=1).argmax()
3
0 / 0 / 0 Регистрация: 29.01.2016 Сообщений: 6 |
|
1 |
|
Определить последовательность с минимальной суммой элементов29.01.2016, 19:56. Показов 3045. Ответов 5
выручайте,буду долженн(( Входные данные Выходные данные Примеры
0 |
Marinero 2793 / 2036 / 682 Регистрация: 02.03.2015 Сообщений: 6,509 |
||||
29.01.2016, 22:52 |
2 |
|||
0 |
YakobsEA 268 / 96 / 75 Регистрация: 04.12.2015 Сообщений: 369 Записей в блоге: 1 |
||||
30.01.2016, 12:14 |
3 |
|||
Не, не, не… Это работает только для частного случая с тремя ступеньками. А у нас
В первой строке входного файла вводится одно натуральное число N100 — количество ступенек. Тут алгоритм другой должен быть… Добавлено через 8 часов 20 минут
Верю, что это можно сделать короче, использовав специализированные библиотеки и глубокие знания языка. К сожалению «моя питон хуже твоя питон». Пока я только так умею.
0 |
0 / 0 / 0 Регистрация: 29.01.2016 Сообщений: 6 |
|
30.01.2016, 12:47 [ТС] |
4 |
0 |
268 / 96 / 75 Регистрация: 04.12.2015 Сообщений: 369 Записей в блоге: 1 |
|
30.01.2016, 15:18 |
5 |
Что именно не проходит? Добавлено через 14 минут
0 |
0 / 0 / 0 Регистрация: 29.01.2016 Сообщений: 6 |
|
30.01.2016, 15:38 [ТС] |
6 |
всем спасибо, я решил )
0 |
С клавиатуры вводится кол-во элементов массива и сам массив чисел. Размер массива не больше 100 элементов. Нужно вывести элемент с минимальной суммой цифр в одну строку(если таких несколько, вывести минимальный из них). А во вторую, элемент с максимальной суммой цифр(если таких несколько, вывести максимальный из них)
В примере ниже: 11(1+1=2); 21(2+1=3); 111(1+1+1=3), 2-минимальная сумма, 3-максимальная, но т.к. элементов с суммой цифр равной 3м-два, то выводится максимальный из них т.е. 111
Подскажите, пожалуйста, алгоритм действий, поскольку у меня даже нет идей как выполнить поставленную задачу
Я знаю как найти сумму цифр числа, но как из массива взять число для проверки(и при этом, в случае если чисел с минимальной/максимальной суммой несколько, определить какое из них стоит выводить)-не понимаю
Пример
Вход
3
11 21 111
Выход
11
111
Как рассчитать минимальную сумму элементов в матричном питоне? например:
z =
np.array([[1, 2, 3],
[3, 2, 5],
[2, 4, 4]])
Минимальная сумма элемента: 1 + 2 + 2 = 5
Я устал:
def calculate(a):
sum = 0
for i in range(len(a)):
sum += np.sum(a[i])
return sum
Но это дает мне 26 вместо 5
7 ответов
Лучший ответ
Вы добавляете сумму всей строки к сумме, когда вы должны добавить минимальное значение. Так что просто замените sum
на min
:
z = np.array([[1, 2, 3], [3, 2, 5], [2, 4, 4]])
def calculate(a):
sum = 0
for row in a:
sum += np.min(row)
return sum
print(calculate(z))
>>> 5
Я также оптимизировал ваш метод цикла, чтобы быть более понятным.
1
Mandera
1 Июн 2020 в 11:34
Итак, вы z
в качестве следующего массива. В NumPy вы должны понимать axis
массива: (пожалуйста, посмотрите этот ответ для лучшего умственного образа: очень базовая-numpy-массив-измерение-визуализация). Итак, массив здесь 2D.
#----> axis: 1 #| a
array([[1, 2, 3], #| x
[3, 2, 5], #| i
[2, 4, 4]]) #| s
#v 0
Итак, мы находим минимум вдоль axis 1
In [70]: np.min(z, axis=1)
Out[70]: array([1, 2, 2])
А так как вам также нужна сумма, вы вызываете .sum()
для результирующего 1D массива из вышеприведенного шага. Ниже приведен код в одной строке:
In [71]: np.min(z, axis=1).sum()
Out[71]: 5
Общее практическое правило заключается в том, чтобы не использовать циклы for
с массивами NumPy, поскольку это будет очень медленно (с точки зрения времени выполнения).
0
kmario23
1 Июн 2020 в 17:08
Вы можете использовать np.min()
: —
z = np.array([[1,2,3],[3,2,5],[2,4,4]])
res = sum(np.min(z, axis=1))
print(res)
Выход:
5
1
Dhaval Taunk
1 Июн 2020 в 11:38
Вы не должны использовать циклы for для выполнения операций с массивами Numpy. Numpy существует, чтобы предоставлять оптимизированные альтернативы циклам, и использование циклов побеждает эту цель. Вы можете взять минимальное значение каждой строки (сворачивая первую ось), а затем суммировать получающиеся три значения:
np.sum(np.min(z, axis=1))
Out[61]: 5
3
Nicolas Gervais
1 Июн 2020 в 14:34
Вы можете применить функцию, чтобы найти минимальное значение для каждой строки и сумму после этого.
import numpy as np
z = np.array([[1, 2, 3],
[3, 2, 5],
[2, 4, 4]])
np.apply_along_axis(np.min,-1,z).sum()
Как это работает? Сначала вы определяете функцию. Нахождение минимального значения, в этом случае. Во-вторых, вы определяете ось, которую вы хотите найти вам значения. Смотрите полное описание в документации ниже. Ласли я запускаю .sum (), чтобы суммировать все элементы. Для учебных целей я предлагаю только бег
np.apply_along_axis(np.min,-1,z)
Подробнее читайте в документации Numpy
1
pinegulf
1 Июн 2020 в 11:41
Вы найдете np.min
над осью 1.
z = np.array([[1, 2, 3], [3, 2, 5], [2, 4, 4]])
z.min(1).sum()
# 5
1
Ch3steR
1 Июн 2020 в 11:38
Пытаться:
min_sum = sum(map(np.min,z))
print(min_sum) # output: 5
1
Gabip
1 Июн 2020 в 11:39
python.
Напишите программу, которая находит в матрице строку с минимальной суммой.
Входные данные
В первой строке записаны через пробел размеры матрицы: количество строк N и количество
столбцов M (1 ≤ N, M ≤ 100 ). В следующих N строках записаны строки матрицы, в каждой
– по M натуральных чисел, разделённых пробелами.
Выходные данные
Программа должна вывести все элементы найденной строки с минимальной суммой,
разделив их пробелами. Если строк с одинаковой минимальной суммой несколько, нужно
выбрать из них строку с минимальным индексом.
Примеры
Входные данные
4 5
1 3 2 54 234
75 12 3 46 9
13 26 56 9 12
14 90 897 6 34
Выходные данные
13 26 56 9 12