Ответ 1
Свертка - это математический оператор, используемый в основном для обработки сигналов. Numpy просто использует эту номенклатуру обработки сигналов, чтобы определить ее, отсюда и ссылки на "сигналы". Массив в NumPy является сигналом. Свертка двух сигналов определяется как интеграл первого сигнала, инвертированный, охватывающий ("свернутый") второй сигнал и умножаемый (со скалярным произведением) на каждую позицию перекрывающихся векторов. Первый сигнал часто называют ядром, особенно когда он представляет собой двумерную матрицу в обработке изображений или нейронных сетях, а обращение становится зеркальным отображением в 2-D (НЕ транспонировать). Это можно более четко понять, используя анимацию в Википедии.
Свертки имеют несколько определений в зависимости от контекста. Некоторые начинают свертку, когда начинается перекрытие, в то время как другие начинают, когда перекрытие только частичное. В случае "пустого" "действительного" режима перекрытие определяется как всегда завершенное. Он называется "действительным", поскольку каждое значение, указанное в результате, выполняется без экстраполяции данных.
Например, если ваш массив X имеет длину 2, а массив Y имеет длину 4, свертка X в Y в "действительном" режиме даст вам массив длиной 3.
Первый шаг для X = [4 3]
и Y = [1 1 5 5]
:
[3 4] (X is reversed from [4 3] to [3 4], see note)
[1 1 5 5]
= 3 * 1 + 4 * 1 = 7
Примечание. Если X не был перевернут, операция будет называться взаимной корреляцией вместо свертки.
Второй шаг:
[3 4]
[1 1 5 5]
= 3 * 1 + 4 * 5 = 23
Третий шаг:
[3 4]
[1 1 5 5]
= 3 * 5 + 4 * 5 = 35
Результатом свертки для режима "действительный" будет [7 23 35].
Если перекрытие задано как одна отдельная точка данных (как в случае режима "полный"), в результате вы получите массив длиной 5. Первый шаг:
[3 4]
[1 1 5 5]
= 3 * undefined (extrapolated as 0) + 4 * 1 = 4
И так далее. Существуют дополнительные режимы экстраполяции.