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.
@123 np.minium
это то, что мне нужно. Это сработало.
В принятом вами ответе говорится, что разница между 10 и 90 равна 20, а разница между 90 и 10 равна 80. Действительно ли это то, чего вы хотите?
@user2357112 user2357112 представьте себе часы со 100 минутами, минимальная абсолютная разница между 90 и 10 действительно равна 20 (90->100 + 0->10).
@mozway: Да, я знаю, но в принятом на тот момент ответе говорилось, что это 80, поэтому я пытался выяснить, действительно ли спрашивающий хотел такого поведения ответа.
Один из способов сделать это — использовать 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, что вряд ли будет желаемым поведением.
Второй семестр должен быть np.abs(b-a)
После редактирования это по-прежнему дает разные абсолютные различия между 10 и 90 и между 90 и 10. Это также не дает ожидаемого результата для данного тестового примера.
Я предполагаю, что ОП ошибся со второго по последний элемент, написав 20 вместо 80. Вышеуказанный метод кажется правильным.
Я удалил свой ответ, так как ваш ответ кажется более правильным. Я тоже проголосовал за ваше, так как увидел, что кто-то проголосовал против без каких-либо причин комментировать. это действительно беспокоит в SO. Должен быть закон, согласно которому никто не должен голосовать против без комментариев, чтобы мы знали, кто проголосовал против без причины.
@hamflow не отрицающий голос, но этот ответ на самом деле неверен. Если вы попробуете использовать a = 2 ; b = 1001
, результат будет неверным: 99
(должно быть 1
).
Спасибо @mozway. ты прав. этот ответ можно отредактировать как: print(np.minimum(abs(a - b)%100, abs((b - a) % 100))) и тогда это работает. что-то похожее на ваш ответ. однако я все еще считаю, что голосовать против без комментариев - это неправильно. Еще раз спасибо.
@hamflow, ты снова хаха, ты в крестовом походе, не так ли? Я тебя помню.
@derek-roberts, спасибо. Я проиграл большую часть войн, в которых участвовал, так что, вероятно, это не крестовый поход.
Это классический пример того, для чего используется модульная арифметика. Давайте рассмотрим пример
Здесь Моррис предоставляет все, что вам нужно знать о модуле
Мой источник: математика
«Определение. Пусть 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, здорово
@Дерек, извини. Однако, честно говоря, @ 123 первым опубликовал подход minimum
(в их ответе по модулю учтено неправильно, а в вашем — нет).
Я только сейчас понял, что ты сказал, в любом случае, ничего себе... не волнуйся.
Что вы пробовали?
np.abs(a-b)
для начала?x%100
делает модуль.