python数组处理:如何逐个像素地生成新值

时间:2014-05-26 13:29:38

标签: python arrays raster

我的问题是关于python中的数组操作。我想要做的是用python分析多波段栅格,并根据结果输出另一个栅格。 真实案例:我有一个带有3个波段的光栅,我想看看同一个像素的不同波段值是增加还是减少的顺序(从波段1到波段3)。如果值按递增顺序排列,则新值将被称为“1”,将分配给新输出栅格中的特定像素(或者也可以是同一栅格中的新频段)。如果值按降序排列,则将分配值“2”。我已经定义了函数并读取了数组值,但是我坚持为每个像素递归构建列表,并为新栅格分配新值。

我将发布到目前为止的代码:

import arcpy
import numpy as np

arcpy.env.workspace = r"\\workspace"

def decrease(A):
    return all(A[i] >= A[i+1] for i in range(len(A)-1)) # function to check if a list has decreasing values
def increase(A):
    return all(A[i] <= A[i+1] for i in range(len(A)-1))  # function to check if a list has increasing values
def no0(A,val):
    return[value for value in A if value !=val]   # function to check if a list has 0 values, and if so, strip them

myArray = arcpy.RasterToNumpyArray(r"raster_3bands.img")  # my 3 bands raster

print myArray.shape  # to see how many dimensions the array has
for z in range(3): # where z is the number of bands, in my case 3
    for y in range(6): #the number of columns, i.e. the vertical axis, in my case 6
        for x in range(6): #the number of rows,i.e. the horizontal axis, in my case 6.
            a = myArray[z,y,x] # get all the values for the 3 bands
            print "The value for axes:  ", z,y,x, " is: ",a

我缺少的是: 1.为每个像素构建一个列表的方法,该列表将存储三个相应的波段值,以便我以后可以在这些列表上运行减少和增加功能 2.一种逐像素分配新值并将该数组存储为新栅格的方法。

非常感谢您耐心阅读本文,

的Bogdan

所以,这是3波段栅格的代码:

import arcpy, os
import numpy as np
myArray = arcpy.RasterToNumPyArray(r"\\nas2\home\bpalade\Downloads\test.img")
nbands = 3

print "Array dimensions are: ", myArray.shape
print "\n"
print "The array is: "
print "\n"
print myArray


increasing_pixels = np.product([(myArray[i] <= myArray[i+1]) for i in range(nbands-1)],axis=0)
decreasing_pixels = np.product([(myArray[i] >= myArray[i+1]) for i in range(nbands-1)],axis=0)

new_band = np.zeros_like(myArray[0])

new_band[increasing_pixels] = 1
new_band[decreasing_pixels] = 2

print "\n"
print "The new array is: "
print "\n"
print new_band

结果附加为jpeg

我没有看到jpeg,所以我从结果窗口复制/粘贴:

Array dimensions are:  (3L, 4L, 4L)


The array is: 


[[[60 62 62 60]
  [64 64 63 60]
  [62 62 58 55]
  [59 57 54 50]]

 [[53 55 55 55]
  [57 57 56 55]
  [55 55 51 50]
  [52 50 47 45]]

 [[35 37 37 36]
  [39 39 38 36]
  [37 37 33 31]
  [34 32 29 26]]]


The new array is: 


[[1 1 1 1]
 [2 2 2 2]
 [0 0 0 0]
 [0 0 0 0]]
>>> 

1 个答案:

答案 0 :(得分:0)

首先想到的是代码的结构。当使用numpy时(特别是在这种情况下),您很少需要应用循环。您可以简单地沿轴应用矢量化操作。

在这种情况下,您可以使用数组广播来查找哪些像素组正在增加和减少。

increasing_pixels = (myArray[0] <= myArray[1]) * (myArray[1] <= myArray[2])

这将为您提供一个布尔数组,其中True像素是在三个波段上增加的像素。减少像素可以做同样的事情(这次True意味着在整个波段上减少的像素):

decreasing_pixels = (myArray[0] >= myArray[1]) * (myArray[1] >= myArray[2])

这些数组可以充当光栅的遮罩,允许您识别要更改值的像素。下面是基于原始三个波段上像素的增加或减少值创建新波段的示例。

new_band = np.zeros_like(myArray[0])

new_band[increasing_pixels==True] = 1
new_band[decreasing_pixels==True] = 2

修改

对于任意数量的频段,上述比较可以替换为:

increasing_pixels = np.product([(myArray[i] <= myArray[i+1]) for i in range(nbands-1)],axis=0)
decreasing_pixels = np.product([(myArray[i] >= myArray[i+1]) for i in range(nbands-1)],axis=0)