<p>在@filippo和这个<a href="https://stackoverflow.com/questions/22669252/how-exactly-does-the-reflect-mode-for-scipys-ndimage-filters-work">SO-question</a>的帮助下,我能够重建<code>scipy</code>实现。方法将信息传播到任何一方的方式至关重要。在</p>
<p>下面是一个代码片段,显示了它们是如何相等的</p>
<pre><code>import numpy as np
import scipy.stats
import scipy.ndimage
import matplotlib.pyplot as plt
np.set_printoptions(linewidth=160)
m_init = 7
# Create any signal here...
input_signal_init = []
input_signal_init = np.arange(m_init)
input_signal_init = np.random.choice(range(m_init),m_init)
# Convert to float for better results in scipy.
input_signal_init = np.array(input_signal_init).astype(float)
# Simulating method='reflect'
input_signal = np.array([*input_signal_init[::-1], *input_signal_init, *input_signal_init[::-1]])
# Define new length of input signal
m = len(input_signal)
# Properties of the Gaussian
sgm = 2 # dev for standard distr
radius = 4 * sgm
x = numpy.arange(-radius, radius+1)
n = len(x)
weight_conv = np.zeros(m*(n+m)).reshape(n+m, m)
# Calculate the gaussian
p = np.polynomial.Polynomial([0, 0, -0.5 / (sgm * sgm)])
input_filter = numpy.exp(p(x), dtype=numpy.double)
input_filter /= input_filter.sum()
# Calculate the filter weights
for i in range(weight_conv.shape[1]):
weight_conv[i:(len(input_filter)+i), i] = input_filter
# My own way of calculating the convolution
self_conv = np.sum(weight_conv * input_signal, axis=1)[(2*m_init+1):(3*m_init+1)]
# Convolution provided by numpy
numpy_conv = np.convolve(input_signal, input_filter)[(2*m_init+1):(3*m_init+1)]
# Convolution by scipy with method='reflect'
# !! Here we use t[![enter image description here][2]][2]he original 'input_signal_init'
scipy_conv = scipy.ndimage.filters.gaussian_filter(input_signal_init, sigma=sgm)
</code></pre>
<p>绘制结果总是让人相信你做得很好。。。所以</p>
^{pr2}$
<p>给出以下<a href="https://i.stack.imgur.com/KUAi1.png" rel="nofollow noreferrer">image</a>。在</p>
<p>还可以验证将scipy过滤器的<code>mode</code>设置为<code>'constant'</code>也将创建相同的卷积。在</p>