我的问题是关于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]]
>>>
答案 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)