Справочная информация: я пишу пакет, который требует чего-то очень похожего на свертку массива. (Тропическая Свертка также называется минус плюс свертка). Статья в Википедии не велика, но она здесь: https://en.wikipedia.org/wiki/Network_calculus#Min -plus_algebra
В принципе, если d = mpConv (a, b), то d [c] = max (a [J] + Ь [* * -j тысячу двадцать-три]). Стандартная свертка будет d [c] = сумма (a [j] * b [c -j]).
У меня есть два numpy. Массива a и b, и выходной диапазон должен быть r , Итак, вот что у меня есть сейчас:
def mpConv(a,b,r):
A = len(a) - 1
B = len(b) - 1
return [numpy.amax(a[max(0,c-B) :min(c,A)+1 :+1]+
b[min(c-B,0)-1:max(0,c-A)-B-2:-1],0) for c in r]
Это работает так, как нужно. Раньше я не имел дело с numpy, поэтому меня интересуют эффективность, скорость и просто общие способы использования numpy лучше.
Есть ли более эффективный способ для l oop по сравнению с диапазон г? (Это всегда будет иметь вид r = numpy .arange (s, e), если это имеет значение.)
Это «numpy способ ведения дел?»
Подпрограмма numpy .convolve написана на C, поэтому исходный код не слишком полезен для этого. Я полагаю, я мог бы написать это в C, но я бы потерял силу и легкость python.
Информация о бонусе: Самый быстрый способ, которым я ожидаю, здесь: https://arxiv.org/abs/1212.4771 (Ожерелья, Свертки и X + Y от Бремнера, Чана, Демейна, Эриксона, Уртадо, Яконо, Лангермана, Патраску, Таслакяна) Я не слишком беспокоюсь об этом. Я бы, наверное, реализовал это в C первым. Я не верю, что получу значительное увеличение скорости от не наивных методов.