Python 对Numpy数组执行条件检查的有效方法

Python 对Numpy数组执行条件检查的有效方法,python,if-statement,numpy,Python,If Statement,Numpy,我正在尝试对numpy数组执行一些条件检查,现在我的代码不是很pythonic。有人能提出更有效的方法来编写下面的代码吗 h是一个二维浮点数数组,其维数为nrows*ncols ibound是一个二维整数数组,其维数为nrows*ncols L1TopOld是一个二维浮点数数组,其维数为nrows*ncols eps=1.0e-04 #填补表面的空隙##################################### 对于范围内的i(nrows): 对于范围内的j(ncols): 如果(i

我正在尝试对numpy数组执行一些条件检查,现在我的代码不是很pythonic。有人能提出更有效的方法来编写下面的代码吗

  • h是一个二维浮点数数组,其维数为nrows*ncols
  • ibound是一个二维整数数组,其维数为nrows*ncols
  • L1TopOld是一个二维浮点数数组,其维数为nrows*ncols
  • eps=1.0e-04
    #填补表面的空隙#####################################
    对于范围内的i(nrows):
    对于范围内的j(ncols):
    如果(ibound[i,j]==1和fabs(h[i,j]-nodata)您可以使用。首先,让我们制作一些玩具数据(顺便说一句,如果您自己做这部分,它会有所帮助):

    现在,我们可以决定要修补哪些:

    >>> ibound & (abs(h-nodata) <= eps)
    array([[0, 0, 1, 0],
           [0, 0, 0, 0],
           [0, 1, 0, 0]])
    
    正如注释中指出的,这假设
    ibound
    是一个仅由0和1组成的掩码。如果您确实只想更改
    ibound==1
    (例如,不是2)的情况,这也很容易:

    >>> np.where((ibound == 1) & (abs(h - nodata) <= eps), L1TopOld, h)
    array([[  0.1382408 ,   0.7718657 ,   5.        ,  10.        ],
           [ 10.        ,   0.5595833 ,   0.83703255,  10.        ],
           [ 10.        ,   5.        ,   0.79473842,   0.91882331]])
    
    >>np.其中((ibound==1)和(abs(h-nodata)您可以使用。首先,让我们制作一些玩具数据(顺便说一句,如果您自己做这部分,它会有所帮助):

    现在,我们可以决定要修补哪些:

    >>> ibound & (abs(h-nodata) <= eps)
    array([[0, 0, 1, 0],
           [0, 0, 0, 0],
           [0, 1, 0, 0]])
    
    正如注释中指出的,这假设
    ibound
    是一个仅由0和1组成的掩码。如果您确实只想更改
    ibound==1
    (例如,不是2)的情况,这也很容易:

    >>> np.where((ibound == 1) & (abs(h - nodata) <= eps), L1TopOld, h)
    array([[  0.1382408 ,   0.7718657 ,   5.        ,  10.        ],
           [ 10.        ,   0.5595833 ,   0.83703255,  10.        ],
           [ 10.        ,   5.        ,   0.79473842,   0.91882331]])
    

    >>np.其中((ibound==1)和(abs(h-nodata)如果要修改原始数组:

    import numpy as np
    eps = .01
    nodata = 10
    h = np.array([[0.1382408, 0.7718657, 10. , 10. ],
                  [ 10. , 0.5595833, 0.83703255, 10. ],
                  [ 10. , 10. , 0.79473842, 0.91882331]])
    h.flat[[2,3,4,7,8,9]] = 10
    ibound = np.array([[0, 1, 1, 0],
                       [0, 1, 1, 0],
                       [0, 1, 0, 1]])
    L1TopOld = np.array([[ 5., 5., 5., 5.],
                         [ 5., 5., 5., 5.],
                         [ 5., 5., 5., 5.]])
    
    根据您的条件创建逻辑掩码:

    mask = (ibound == 1) & (abs(h - nodata) <= eps)
    

    如果要修改原始阵列,请执行以下操作:

    import numpy as np
    eps = .01
    nodata = 10
    h = np.array([[0.1382408, 0.7718657, 10. , 10. ],
                  [ 10. , 0.5595833, 0.83703255, 10. ],
                  [ 10. , 10. , 0.79473842, 0.91882331]])
    h.flat[[2,3,4,7,8,9]] = 10
    ibound = np.array([[0, 1, 1, 0],
                       [0, 1, 1, 0],
                       [0, 1, 0, 1]])
    L1TopOld = np.array([[ 5., 5., 5., 5.],
                         [ 5., 5., 5., 5.],
                         [ 5., 5., 5., 5.]])
    
    根据您的条件创建逻辑掩码:

    mask = (ibound == 1) & (abs(h - nodata) <= eps)
    

    您只需继续矢量方式:

    cond = (ibound == 1) & (np.fabs(h - nodata) <= eps)
    h[cond] = L1TopOld[cond]
    

    cond=(ibound==1)和(np.fabs(h-nodata)您只需要继续矢量方式:

    cond = (ibound == 1) & (np.fabs(h - nodata) <= eps)
    h[cond] = L1TopOld[cond]
    

    cond=(ibound==1)和(np.fabs(h-nodata)如果
    ibound
    包含除0和1以外的整数,这会起作用吗?@wwii:你说得对,我假设它是一个0/1掩码。如果不是,你必须用
    (ibound==1)和
    替换
    ibound&
    。我已经看到
    numpy.where()
    经常用于回答,但不知道什么时候应该使用它,而不是有条件地修改原始数组,如
    h[mask]=L1TopOld[mask]
    与布尔索引。有什么提示/想法吗?如果
    ibound
    包含除0和1以外的整数,这会起作用吗?@wwii:没错,我假设它是一个0/1掩码。如果没有,你必须用
    (ibound==1)和
    替换
    ibound&
    。我看过
    numpy.where()
    经常用于回答,但不知道什么时候应该使用它,而不是有条件地修改原始数组,如
    h[mask]=L1TopOld[mask]
    带布尔索引。有什么提示/想法吗?为了澄清,ibound可以有0和1以外的值。我测试了DMS和Taha的建议,两个都对我有效。我更喜欢DSM的建议,因为它给了我一个if/then类型选项。为了澄清,ibound可以有0和1以外的值。我测试了DMS和Taha的建议我更喜欢DSM的建议,因为它给了我一个if/then类型选项。