Найдите абсолютное значение разницы между элементами, используя только операции с массивом NumPy

a = np.array([101,105,90,102,90,10,50])
b = np.array([99,110,85,110,85,90,60])

expected result = np.array([2,5,5,8,5,20,10])

Как я могу найти минимальное абсолютное значение разницы между элементами, используя только операции numpy; с модулем 100, если два значения находятся между 100.

Что вы пробовали? np.abs(a-b) для начала? x%100 делает модуль.

hpaulj 18.08.2024 01:25

@123 np.minium это то, что мне нужно. Это сработало.

Majoris 18.08.2024 01:27

В принятом вами ответе говорится, что разница между 10 и 90 равна 20, а разница между 90 и 10 равна 80. Действительно ли это то, чего вы хотите?

user2357112 18.08.2024 01:56

@user2357112 user2357112 представьте себе часы со 100 минутами, минимальная абсолютная разница между 90 и 10 действительно равна 20 (90->100 + 0->10).

mozway 18.08.2024 07:26

@mozway: Да, я знаю, но в принятом на тот момент ответе говорилось, что это 80, поэтому я пытался выяснить, действительно ли спрашивающий хотел такого поведения ответа.

user2357112 18.08.2024 16:09
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
5
102
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Один из способов сделать это — использовать np.minimum() с abs():

import numpy as np

a = np.array([101, 105, 90, 102, 90, 10, 50])
b = np.array([99, 110, 85, 110, 85, 90, 60])

print(np.minimum(abs(a - b)%100, abs((b - a) % 100)))

Это дает разные абсолютные различия между 10 и 90 и между 90 и 10, что вряд ли будет желаемым поведением.

user2357112 18.08.2024 01:53

Второй семестр должен быть np.abs(b-a)

Majoris 18.08.2024 01:59

После редактирования это по-прежнему дает разные абсолютные различия между 10 и 90 и между 90 и 10. Это также не дает ожидаемого результата для данного тестового примера.

user2357112 18.08.2024 03:40

Я предполагаю, что ОП ошибся со второго по последний элемент, написав 20 вместо 80. Вышеуказанный метод кажется правильным.

hamflow 18.08.2024 07:09

Я удалил свой ответ, так как ваш ответ кажется более правильным. Я тоже проголосовал за ваше, так как увидел, что кто-то проголосовал против без каких-либо причин комментировать. это действительно беспокоит в SO. Должен быть закон, согласно которому никто не должен голосовать против без комментариев, чтобы мы знали, кто проголосовал против без причины.

hamflow 18.08.2024 07:22

@hamflow не отрицающий голос, но этот ответ на самом деле неверен. Если вы попробуете использовать a = 2 ; b = 1001, результат будет неверным: 99 (должно быть 1).

mozway 18.08.2024 07:40

Спасибо @mozway. ты прав. этот ответ можно отредактировать как: print(np.minimum(abs(a - b)%100, abs((b - a) % 100))) и тогда это работает. что-то похожее на ваш ответ. однако я все еще считаю, что голосовать против без комментариев - это неправильно. Еще раз спасибо.

hamflow 18.08.2024 07:48

@hamflow, ты снова хаха, ты в крестовом походе, не так ли? Я тебя помню.

Derek Roberts 18.08.2024 11:50

@derek-roberts, спасибо. Я проиграл большую часть войн, в которых участвовал, так что, вероятно, это не крестовый поход.

hamflow 18.08.2024 13:13

Это классический пример того, для чего используется модульная арифметика. Давайте рассмотрим пример

Здесь Моррис предоставляет все, что вам нужно знать о модуле

Мой источник: математика

«Определение. Пусть m > 0 — целое положительное число, называемое модулем. Мы говорим, что два целых числа a и b равны конгруэнтно по модулю m, если b − a делится на m. Другими словами, a ≡ b(modm) ⇐⇒ a − b = m · k для некоторых целых чисел "

Возьмем, к примеру, 10 и 90:

Другими словами, переход напрямую от 10 к 90 дает разницу в 80, но если учесть циклический переход (переход назад от 10 к 0, а затем вперед от 100 к 90), вы получите меньшую разницу в 20.

Я предоставил код, который помогает

Например:

import numpy as np

a = np.array([101, 105, 90, 102, 90, 10, 50])
b = np.array([99, 110, 85, 110, 85, 90, 60])

# Start by computing absolute difference
absolute_of_two_nos = np.abs(a % 100 - b % 100)

# Then consider the difference- wrap-around using modulus of 100
diff_mod_using_100 = 100 - np.abs(a % 100 - b % 100)

# Take the minimum of the direct diff and the modulus diff
result = np.minimum(absolute_of_two_nos, diff_mod_using_100)

print(result)
Ответ принят как подходящий

Ответ Дерека Робертса с numpy.minimum почти правильный. Однако, поскольку входные значения могут превышать 100, их следует сначала масштабировать до 0–100 с помощью %100 ( мод). Я добавляю дополнительную пару значений, чтобы продемонстрировать это:

a = np.array([101,105,90,102,90,10,50,1001])
b = np.array([99,110,85,110,85,90,60,2])

x = abs(a%100-b%100)
np.minimum(x, 100-x)

Общий расчет:

M = 100
x = abs(a%M-b%M)
np.minimum(x, M-x)

Выход:

array([ 2,  5,  5,  8,  5, 20, 10,  1])

блин, тебе присудили очки, очень грустно... ты использовал мою репутацию, хаха @mozway, здорово

Derek Roberts 18.08.2024 11:52

@Дерек, извини. Однако, честно говоря, @ 123 первым опубликовал подход minimum (в их ответе по модулю учтено неправильно, а в вашем — нет).

mozway 18.08.2024 12:19

Я только сейчас понял, что ты сказал, в любом случае, ничего себе... не волнуйся.

Derek Roberts 18.08.2024 12:55

Другие вопросы по теме