用相邻单元格的 nanmean() 值替换 2D 数组中的所有 nan

问题描述 投票:0回答:1

我有一个 2D 数组,其中包含一些 nan,我想执行以下操作:

  • 将数组中的每个 nan 替换为相邻单元格的 nanmean() 值。
  • 如果相邻单元格都是nan,则值为nan
  • 如果相邻单元格中有一些nan,则该值为相邻相邻单元格的nanmean()值。 让我们举一些例子:
a = np.random.randint(0,100,60).astype(float)
a = a.reshape(6,10) 
a[1,1]= np.nan
a[2:5,4:7]=np.nan
a
array([[48., 84., 80., 59., 43., 60., 31., 37.,  4., 75.],
       [83., nan, 52., 34., 95., 15., 69.,  7.,  7., 16.],
       [10.,  6.,  6., 44., nan, nan, nan, 95., 28.,  4.],
       [12.,  1., 62., 96., nan, nan, nan, 66., 21., 80.],
       [41., 18.,  1., 49., nan, nan, nan, 27., 64., nan],
       [13., 33., 98., 85., 77., 20., 73., 57., 15., 28.]])

# In this array a[1,1] is a nan and should be replaced by 46.125
np.nanmean(np.array([48.,84.,80.,52.,6.,6.,10.,83.]))
46.125

# Another example a[2,4] is a nan and should be replaced by 56.8
np.nanmean(np.array([34.,95.,15.,44.,96.]))
56.8

etc.

到目前为止,我已经尝试过以下技术:

  • 使用一些循环:非常简单,但如果数组很大(1000 x 1000)则非常慢
  • Scipy NearestNDInterpolator,有趣,但替换所有 nan(被 nan 包围的 nan 必须保留 nan!)

如何以最快的方式做到这一点,而不循环?

numpy replace scipy interpolation nan
1个回答
0
投票

使用 2D 卷积:

from scipy.signal import convolve2d

m = np.isnan(a)
kernel = np.ones((3, 3))

S1 = convolve2d(np.nan_to_num(a), kernel, mode='same')
S2 = convolve2d(~m, kernel, mode='same')

a[m] = S1[m]/S2[m]

已更新

a

array([[48.  , 84.  , 80.  , 59.  , 43.  , 60.  , 31.  , 37.  ,  4.  , 75.  ],
       [83.  , 46.12, 52.  , 34.  , 95.  , 15.  , 69.  ,  7.  ,  7.  , 16.  ],
       [10.  ,  6.  ,  6.  , 44.  , 56.8 , 59.67, 50.4 , 95.  , 28.  ,  4.  ],
       [12.  ,  1.  , 62.  , 96.  , 63.  , 57.9 , 62.67, 66.  , 21.  , 80.  ],
       [41.  , 18.  ,  1.  , 49.  , 65.4 , 56.67, 48.6 , 27.  , 64.  , 41.6 ],
       [13.  , 33.  , 98.  , 85.  , 77.  , 20.  , 73.  , 57.  , 15.  , 28.  ]])
© www.soinside.com 2019 - 2024. All rights reserved.