<pre><code>def neighbours(test_arr_in,fstnotnan_in,count_in,countused_in):
for r in range(len(np.where(fstnotnan_in==1)[0])):
x = np.where(count_in == 1)[0][r]
y = np.where(count_in == 1)[1][r]
if np.isnan(countused_in[x][y]) == True:
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(test_arr_in[c[0],c[1]]) == False:
fstnotnan_in[c[0],c[1]] = 1
count_in = np.where(fstnotnan_in == 1,1.,0)
return fstnotnan_in,count_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]
temp_amatrix = np.matrix(test_arr)
p = np.argwhere(test_arr == np.nanmax(temp_amatrix)).flatten()[0]
q = np.argwhere(test_arr == np.nanmax(temp_amatrix)).flatten()[1]
countused = np.zeros_like(test_arr)
fstnotnan = np.zeros_like(test_arr)
count = np.full((row,col),np.nan)
fstnotnan[p,q] = 1
count[p,q] = 1
</code></pre>
<p>一步一步地,第二个结果完成了</p>
<pre><code>fstnotnan_out,count_out,countused_out = neighbours(test_arr,fstnotnan,count,countused)
fstnotnan_out1,count_out1,countused_out1 = neighbours(test_arr,fstnotnan_out,count_out,countused_out)
fstnotnan_out2,count_out2,countused_out2 = neighbours(test_arr,fstnotnan_out1,count_out1,countused_out1)
fstnotnan_out3,count_out3,countused_out3 = neighbours(test_arr,fstnotnan_out2,count_out2,countused_out2)
fstnotnan_out4,count_out4,countused_out4 = neighbours(test_arr,fstnotnan_out3,count_out3,countused_out3)
</code></pre>
<p>然而,这只是一个例子。我的数据集有一万多行和列。所以我想递归地完成这个目标。我尝试以下代码:</p>
<pre><code>def neighbours(test_arr_in,fstnotnan_in,count_in,countused_in):
if (np.where(fstnotnan_in== 1)[0].shape[0] == np.where(np.isnan(countused_in))[0].shape[0]) == True:
return fstnotnan_in,count_in,countused_in
else:
for r in range(len(np.where(fstnotnan_in==1)[0])):
x = np.where(count_in == 1)[0][r]
y = np.where(count_in == 1)[1][r]
if np.isnan(countused_in[x][y]) == True:
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(test_arr_in[c[0],c[1]]) == False:
fstnotnan_in[c[0],c[1]] = 1
count_in = np.where(fstnotnan_in == 1,1.,0)
return neighbours(test_arr_in,fstnotnan_in,count_in,countused_in)
</code></pre>
<p>没关系。我明白了</p>