Numpy Mask数组多次,并用另一个3D数组中的值填充3D数组中的nans

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

我有以下代码:

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个数组,这看起来如何?谢谢!

python arrays numpy masking
1个回答
0
投票

您的功能可以通过多种方式简化。在效率方面,最重要的方面是您不需要迭代第一维,可以直接在整个阵列上进行操作。除此之外,您可以将替换逻辑重构为更简单的内容,并使用循环避免重复重复相同的代码:

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
        out_arr[mask] = arr[np.abs(out_arr) <= thresh]
    return out_arr

由于thresh需要在此函数中作为关键字参数传递,因此您将其称为:

arr = fill(arr1, arr2, arr3, arr4, thresh=0.5)
© www.soinside.com 2019 - 2024. All rights reserved.