<p><em>我把这当作是一种学习练习。不是真正的<code>numpy</code>用户</em></p>
<p><strong>TLDR</strong>:</p>
<pre class="lang-py prettyprint-override"><code>search_area = np.arange(25).reshape(5,5)
search_kernel = np.array([[0, 1, 0], [1, 1, 1], [0, 1, 0]])
results = convolve2d(search_area, search_kernel, mode='same')
max_index = np.argmax(results, axis=None)
max_location = np.unravel_index(max_index, results.shape)
print(max_location)
</code></pre>
<hr/>
<p>假设5个相邻的意思是:上、下、左、右、中,那么你可以用卷积法找到这个值</p>
<p>假设我们只想找到标记为1的值的每个3x3块的总和:</p>
<pre><code>[[0, 1, 0],
[1, 1, 1],
[0, 1, 0]]
</code></pre>
<p>此形状可以用作卷积的内核。它将用于将3x3平方中的每个值相加,将其相应的值乘以1。e、 g代表</p>
<pre><code>[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
</code></pre>
<p>你会得到<code>1x0 + 2x1 + 3x0 + 4x1 + 5x1 + 6x1 + 7x0 + 8x1 + 9x0 = 25</code></p>
<p><code>scipy</code>有一个用于此的方法称为<code>convolve2d</code></p>
<pre class="lang-py prettyprint-override"><code>import numpy as np
from scipy.signal import convolve2d
search_area = np.arange(36).reshape(6,6)
search_kernel = np.array([[0, 1, 0], [1, 1, 1], [0, 1, 0]])
results = convolve2d(search_area, search_kernel)
print(search_area)
print(results)
</code></pre>
<p>这将产生:</p>
<pre><code>[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]
[24 25 26 27 28 29]
[30 31 32 33 34 35]]
[[ 0 0 1 2 3 4 5 0]
[ 0 7 10 14 18 22 20 5]
[ 6 25 35 40 45 50 43 11]
[ 12 49 65 70 75 80 67 17]
[ 18 73 95 100 105 110 91 23]
[ 24 97 125 130 135 140 115 29]
[ 30 85 118 122 126 130 98 35]
[ 0 30 31 32 33 34 35 0]]
</code></pre>
<p>因为我们将边作为卷积的一部分包括在内,所以您将看到结果大小现在是8x8,而不是原来的6x6。对于由于超出数组边缘而无法找到的值,该方法假定值为零</p>
<p>要放弃这些边,可以使用<code>same</code>模式,该模式使其从结果中删除这些边:</p>
<pre><code>results = convolve2d(search_area, search_kernel, mode='same')
print(search_area)
print(results)
</code></pre>
<pre><code>[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]
[24 25 26 27 28 29]
[30 31 32 33 34 35]]
[[ 7 10 14 18 22 20]
[ 25 35 40 45 50 43]
[ 49 65 70 75 80 67]
[ 73 95 100 105 110 91]
[ 97 125 130 135 140 115]
[ 85 118 122 126 130 98]]
</code></pre>
<p>现在要找到蜜蜂最多的位置,可以使用<code>argmax</code>获得最大值的索引,并使用<code>unravel_index</code>将其作为原始形状中的位置</p>
<pre><code>max_index = np.argmax(results, axis=None)
max_location = np.unravel_index(max_index, results.shape)
print(max_location)
</code></pre>
<pre><code>(4, 4)
</code></pre>