<p>我做完了。代码如下:</p>
<pre><code>def sechmax(arr_in):
temp_amatrix = np.matrix(arr_in)
r_max = np.argwhere(arr_in == np.nanmax(temp_amatrix)).flatten()[0]
c_max = np.argwhere(arr_in == np.nanmax(temp_amatrix)).flatten()[1]
return r_max,c_max
def neighbours(arr_in,fstnotnan_in,countused_in):
if (np.where(fstnotnan_in == 1)[0].shape[0] == np.where(np.isnan(countused_in))[0].shape[0]):
n_arr_in = np.where(countused_in == 0,arr_in,np.nan)
if np.isnan(n_arr_in).all():
return fstnotnan_in,countused_in
else:
r_max,c_max = sechmax(n_arr_in)
fstnotnan_in[r_max,c_max] = 1
return neighbours(n_arr_in,fstnotnan_in,countused_in)
else:
count = fstnotnan_in.copy()
for r in range(len(np.where(fstnotnan_in==1)[0])):
x = np.where(count == 1)[0][r]
y = np.where(count == 1)[1][r]
if np.isnan(countused_in[x][y]):
continue
else:
countused_in[x,y] = np.nan
indexlist = [[x-1,y-1],[x-1,y],[x-1,y+1],[x,y-1],[x,y+1],[x+1,y-1],[x+1,y],[x+1,y+1]]
for c in indexlist:
if 0 <= c[0] < row and 0 <= c[1] < col:
if np.isnan(arr_in[c[0],c[1]]) == False:
fstnotnan_in[c[0],c[1]] = 1
return neighbours(arr_in,fstnotnan_in,countused_in)
test_arr = np.array([[1,2,np.nan,np.nan,5],
[np.nan,2,np.nan,5,np.nan],
[np.nan,2,4,np.nan,6],
[np.nan,np.nan,np.nan,5,5],
[np.nan,np.nan,np.nan,np.nan,np.nan],
[1,2,4,np.nan,np.nan],
[1,2,np.nan,np.nan,5],
[np.nan,4,np.nan,np.nan,6]])
row = test_arr.shape[0]
col = test_arr.shape[1]
r_max,c_max = sechmax(test_arr)
countused = np.zeros_like(test_arr)
fstnotnan = np.zeros_like(test_arr)
fstnotnan[r_max,c_max] = 1
fstnotnan_out,countused_out = neighbours(test_arr,fstnotnan,countused)
</code></pre>