This seems like a trick:
import numpy as np def shift_time(dat): NX, NY = dat.shape for i in range(NY): x, y = np.where(np.isnan(dat)) xr = x - 1 yr = y + 1 idx = (xr >= 0) & (yr < NY) dat[x[idx], y[idx]] = dat[xr[idx], yr[idx]] return
Now with some test data:
In [1]: test_data = array([[ 11.2, 12.2, 14. , 15. , 11.3, 12. ], [ nan, nan, nan, nan, nan, nan], [ nan, nan, nan, nan, nan, nan], [ 14.7, 11.5, 12.2, 13. , 14.3, 15.1], [ nan, nan, nan, nan, nan, nan], [ 15.7, 16.5, 17.2, 18. , 14. , 12. ]]) In [2]: shift_time(test_data) In [3]: print test_data Out [3]: array([[ 11.2, 12.2, 14. , 15. , 11.3, 12. ], [ 12.2, 14. , 15. , 11.3, 12. , nan], [ 14. , 15. , 11.3, 12. , nan, nan], [ 14.7, 11.5, 12.2, 13. , 14.3, 15.1], [ 11.5, 12.2, 13. , 14.3, 15.1, nan], [ 15.7, 16.5, 17.2, 18. , 14. , 12. ]])
And testing with an array (1e4, 1e2):
In [1]: tmp = np.random.uniform(-10, 20, (1e4, 1e2)) In [2]: nan_idx = np.random.randint(30, 1e4 - 1,1e4) In [3]: tmp[nan_idx] = nan In [4]: time test3(tmp) CPU times: user 1.53 s, sys: 0.06 s, total: 1.59 s Wall time: 1.59 s