花式索引中的多个条件

2 投票
1 回答
3025 浏览
提问于 2025-04-17 22:01

我刚开始学习Python,正在尝试对栅格图像进行一些简单的分类。基本上,我把一个TIF格式的图像读取成一个二维数组,然后对它进行一些计算和处理。在分类的部分,我想创建三个空数组,分别用来表示土地、水和云。这些类别会在多个条件下被赋值为1,最终我会把这些类别分别标记为landclass=1、waterclass=2和cloudclass=3。

显然,我可以在一个条件下把数组中的所有值都设置为1,像这样:

     crop = gdal.Open(crop,GA_ReadOnly)
     crop = crop.ReadAsArray()
     rows,cols = crop.shape
     mode = int(stats.mode(crop, axis=None)[0])
     water = np.empty(shape(row,cols),dtype=float32)
     land = water
     clouds = water

然后我得到了这样的结果(输出):

     >>> land
     array([[ 0.,  0.,  0., ...,  0.,  0.,  0.],
           [ 0.,  0.,  0., ...,  0.,  0.,  0.],
           [ 0.,  0.,  0., ...,  0.,  0.,  0.],
           ..., 
           [ 0.,  0.,  0., ...,  0.,  0.,  0.],
           [ 0.,  0.,  0., ...,  0.,  0.,  0.],
           [ 0.,  0.,  0., ...,  0.,  0.,  0.]], dtype=float32)
     >>> land[water==0]=1
     >>> land
     array([[ 0.,  0.,  0., ...,  1.,  1.,  1.],
            [ 0.,  0.,  0., ...,  1.,  1.,  1.],
            [ 0.,  0.,  0., ...,  1.,  1.,  1.],
            ..., 
            [ 1.,  1.,  1., ...,  0.,  0.,  0.],
            [ 1.,  1.,  1., ...,  0.,  0.,  0.],
            [ 1.,  1.,  1., ...,  0.,  0.,  0.]], dtype=float32)
     >>> land[crop>mode]=1
     >>> land
     array([[ 0.,  0.,  0., ...,  1.,  1.,  1.],
            [ 0.,  0.,  0., ...,  1.,  1.,  1.],
            [ 0.,  0.,  0., ...,  1.,  1.,  1.],
            ..., 
            [ 1.,  1.,  1., ...,  0.,  0.,  0.],
            [ 1.,  1.,  1., ...,  0.,  0.,  0.],
            [ 1.,  1.,  1., ...,  0.,  0.,  0.]], dtype=float32)

但是,我该如何在不改变数组形状的情况下,让“land”中的值在几个条件下都等于1呢?我试着这样做:

land[water==0,crop>mode]=1

结果出现了ValueError错误。我又试了这个:

land[water==0 and crop>mode]=1

然后Python让我使用a.all()或者a.all()....

对于只有一个条件的情况,结果正是我想要的,我必须这样做才能得到结果。例如(这是我实际代码中的内容):

water[band6 < b6_threshold]=1
water[band7 < b7_threshold_1]=1
water[band6 > b6_threshold]=1
water[band7 < b7_threshold_2]=1

land[band6 > b6_threshold]=1
land[band7 > b7_threshold_2]=1
land[clouds == 1]=1
land[water == 1]=1
land[b1b4 < 0.5]=1
land[band3 < 0.1)]=1    

clouds[land == 0]=1
clouds[water == 0]=1
clouds[band6 < (b6_mode-4)]=1

我发现这有点让人困惑,我想把所有条件合并到一个语句中……有什么建议吗?

非常感谢!

1 个回答

1

你可以把布尔数组相乘,这样就像是在做“与”的运算:

>>> import numpy as np
>>> a = np.array([1,2,3,4])
>>> a[(a > 1) * (a < 3)] = 99
>>> a
array([ 1, 99,  3,  4])

而你可以把它们相加,这样就像是在做“或”的运算:

>>> a[(a > 1) + (a < 3)] = 123
>>> a
array([123, 123, 123, 123])

另外,如果你更喜欢用布尔逻辑来理解,而不是把真和假看作0和1,你也可以使用运算符 &| 来达到同样的效果。

撰写回答