Python 对Numpy数组执行条件检查的有效方法
我正在尝试对numpy数组执行一些条件检查,现在我的代码不是很pythonic。有人能提出更有效的方法来编写下面的代码吗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
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类型选项。