我有一个 2D 数组,其中包含一些 nan,我想执行以下操作:
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.
到目前为止,我已经尝试过以下技术:
如何以最快的方式做到这一点,而不循环?
使用 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. ]])