Numpy замаскируйте массив несколько раз и заполните наны в 3D-массиве значениями из другого 3D-массива - PullRequest
1 голос
/ 29 мая 2020

У меня есть следующий код:

import numpy as np



def fill(arr1, arr2, arr3, arr4, thresh= 0.5):
    out_arr = np.zeros(arr1.shape)
    for i in range(0,len(arr1)):
        arr1[i] = np.where(np.abs(arr1[i])<=thresh,np.nan,arr1[i])
        mask = np.isnan(arr1[i])
        arr1[i] = np.nan_to_num(arr1[i])
        merged1 = (arr2[i]*mask)+arr1[i]


        merged2 = np.where(np.abs(merged1)<=thresh,np.nan,merged1)
        mask = np.isnan(merged2)
        merged2 = np.nan_to_num(merged2)
        merged3 = (arr3[i]*mask)+merged2

        merged3 = np.where(np.abs(merged3)<=thresh,np.nan,merged3)
        mask = np.isnan(merged3)
        merged3 = np.nan_to_num(merged3)
        merged4 = (arr4[i]*mask)+merged3



        out_arr[i] = merged4


    return(out_arr)




arr1 = np.random.rand(10, 10, 10)
arr2 = np.random.rand(10, 10, 10)
arr3 = np.random.rand(10, 10, 10)
arr4 = np.random.rand(10, 10, 10)
arr = fill(arr1, arr2, arr3, arr4, 0.5)

Интересно, есть ли более эффективный способ сделать это, возможно, с маскированными массивами? В основном то, что я делаю, - это заменять значения ниже порога в каждом слое 3D-массива на следующий массив, а это более 4 массивов. Как это будет выглядеть для n массивов? Спасибо!

1 Ответ

1 голос
/ 29 мая 2020

Ваша функция может быть упрощена несколькими способами. С точки зрения эффективности наиболее важным аспектом является то, что вам не нужно выполнять итерацию по первому измерению, вы можете работать со всеми массивами напрямую. Кроме того, вы можете реорганизовать замену logi c на что-то гораздо более простое и использовать aal oop, чтобы избежать повторения одного и того же кода снова и снова:

import numpy as np

# Function accepts as many arrays as wanted, with at least one
# (threshold needs to be passed as keyword parameter)
def fill(arr1, *arrs, thresh=0.5):
    # Output array
    out_arr = arr1.copy()
    for arr in arrs:
        # Replace values that are still below threshold
        mask = np.abs(out_arr) <= thresh
        out_arr[mask] = arr[mask]
    return out_arr

Поскольку thresh необходимо передать как параметр ключевого слова в этой функции, вы бы назвали его как:

arr = fill(arr1, arr2, arr3, arr4, thresh=0.5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...