使用python,numpy重新分类栅格值

时间:2016-04-28 09:16:37

标签: python numpy

我有一个包含值[0,1,2,3,4,255]的栅格,我想重新分类它。它按照像素逐行工作很好,但这需要永远,所以我试着改变它......:

# working
for j in range(cf.RasterXSize):
    for i in range(cf.RasterYSize):
        if cf_array[i, j] <= 1:
            cf_array[i, j] = 5  # 5 = No Clouds
        elif 1 < cf_array[i, j] <= 4:
            cf_array[i, j] = 6  # 6 = Clouds
        elif 4 < cf_array[i, j]:
            cf_array[i, j] = 7  # 7 = NoData

# Not working:
cf_array[np.where(cf_array <= 1)] = 5
cf_array[np.where((1 < cf_array) & (cf_array <= 4))] = 6
cf_array[np.where(cf_array > 4)] = 7

values = list(numpy.unique(cf_array))
print (values)

这是我用列表打印值列表时获得的(numpy.unique(cf_array))
原始光栅:[0,1,2,3,4,255]
重新分类尝试后:[7]

那么,为什么这不起作用?我找到了几个关于栅格重新分类的现有线程但是所有人都提出了 numpy.where 方法,这显然对我不起作用......

3 个答案:

答案 0 :(得分:1)

正如已经指出的那样,您不需要其中,但是,我认为问题是您的陈述的订单。您首先将一些元素分别设置为五个和六个,然后最终将所有元素设置为四到七个 - 这将包括之前设置为五个和六个的所有元素。它应该通过改变顺序来工作:

val splits = parsedData.randomSplit(Array(0.6, 0.4), seed = 11L)
val training = splits(0)
val test = splits(1)

或许值得一提:由于排序在这里产生了这样的差异并且可能引入难以找到的细微问题,更安全的方法可能是首先收集索引并随后更改目标数组:

cf_array[cf_array > 4] = 7
cf_array[cf_array <= 1] = 5
cf_array[(1 < cf_array) & (cf_array <= 4)] = 6

答案 1 :(得分:0)

您不需要numpy.where。尝试:

cf_array[cf_array <= 1] = 5
cf_array[(1 < cf_array) & (cf_array <= 4)] = 6
cf_array[cf_array > 4] = 7

答案 2 :(得分:0)

你可以简单地使用np.searchsorted进行这样的分箱操作,就像这样 -

np.searchsorted([1,4],cf_array)+5 # [1,4] act as the bin boundaries

示例运行 -

In [55]: cf_array
Out[55]: 
array([[4, 4, 2, 5, 6],
       [0, 5, 5, 6, 0],
       [8, 3, 6, 1, 5],
       [6, 5, 8, 1, 2]])

In [56]: np.searchsorted([1,4],cf_array)+5
Out[56]: 
array([[6, 6, 6, 7, 7],
       [5, 7, 7, 7, 5],
       [7, 6, 7, 5, 7],
       [7, 7, 7, 5, 6]], dtype=int64)