У меня есть трехмерный DataArray, и я хотел бы определить индексы, в которых окно 3x3 в последних двух измерениях не содержит никаких nans.
Рассмотрим такие игрушечные данные:
Мой подход — создать скользящий набор данных и уменьшить его, как показано ниже. Обратите внимание, что я не могу использовать arr.rolling(...).construct(...), потому что мои фактические данные слишком велики.
Я понимаю, что внешняя граница — нан, потому что там невозможно построить окно 3х3. Но я не понимаю, почему наны появляются и внутри массива. Если окно имеет nan, разве np.all не должен возвращать false, а затем приводить его к нулю?
Меня интересуют только ячейки с единицами, так что это не большое дело. Но мне любопытно узнать, почему это происходит.
У меня есть трехмерный DataArray, и я хотел бы определить индексы, в которых окно 3x3 в последних двух измерениях не содержит никаких nans. Рассмотрим такие игрушечные данные: [code]np.random.seed(1234) arr = np.random.rand(20, 10, 10) arr[arr < 0.1] = np.nan arr = xr.DataArray(arr, dims=["time", "x", "y"]) [/code] Мой подход — создать скользящий набор данных и уменьшить его, как показано ниже. Обратите внимание, что я не могу использовать arr.rolling(...).construct(...), потому что мои фактические данные слишком велики. [code]result = arr.rolling(center=True, x=3, y=3)\ .reduce(lambda x, axis: np.all(~np.isnan(x), axis=axis)) [/code] Кажется, это работает, но почему на выходе получается смесь nans и 1, а не nans, 1 и 0? [code]> result.isel(time=0)
array([[nan, nan, nan, nan, nan, nan, nan, nan, nan, nan], [nan, nan, nan, nan, 1., 1., nan, nan, nan, nan], [nan, nan, nan, nan, 1., 1., nan, nan, nan, nan], [nan, nan, nan, nan, 1., nan, nan, nan, 1., nan], [nan, nan, nan, nan, nan, nan, nan, nan, 1., nan], [nan, nan, nan, nan, nan, nan, nan, nan, 1., nan], [nan, 1., nan, nan, nan, nan, nan, nan, nan, nan], [nan, 1., 1., 1., nan, nan, nan, nan, nan, nan], [nan, 1., 1., 1., 1., 1., 1., nan, nan, nan], [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]]) [/code] Я понимаю, что внешняя граница — нан, потому что там невозможно построить окно 3х3. Но я не понимаю, почему наны появляются и внутри массива. Если окно имеет nan, разве np.all не должен возвращать false, а затем приводить его к нулю? Меня интересуют только ячейки с единицами, так что это не большое дело. Но мне любопытно узнать, почему это происходит.