2014-03-12 54 views
2

我是新来的python,我试图对光栅图像进行一些简单的分类。 基本上,我正在读取TIF图像作为二维数组,并对其进行一些计算和操作。对于分类部分,我试图为陆地,水域和云层创建3个空阵列。在多个条件下,这些类将被赋值为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

您可以乘布尔数组的东西喜欢“和”:

>>> 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]) 

或者,如果你喜欢思考的布尔逻辑而不是True和False为0和1,您还可以使用运算符&|达到相同的效果。

+0

hi @wim,我尝试过,仍然有ValueError ... – user3412669

+0

尝试像这样:'土地[(水== 0)&(作物>模式)] = 1' – wim

+0

ohh似乎有用!还有一个questiion,我可以有多个条件使用该表达式?谢谢 – user3412669