在Python中循环遍历多波段栅格中的每个像素

时间:2017-01-26 04:03:05

标签: python arrays loops numpy

我有一个多波段光栅,例如有23个波段。我正在使用GDAL读取栅格并将其转换为numpy数组。当我检查数组形状时,它显示为23,4,5 i.e. 23 = bands, 4 = row and 5 = col。我希望以一种能够获得与一个像素相关的所有23个值的向量/数组的方式遍历每个像素。

我正在通过例子进一步详细解释......

Band 1
    [[1,    2,   3,   4,  5],
     [6,    7,   8,   9,  10],
     [11,   12,  13,  14, 15],
     [16,   17,  18,  19, 20]]
Band 2
    [[21,   22,   23,   24,  25],
     [26,   27,   28,   29,  30],
     [31,   32,   33,   34,  35],
     [36,   37,   38,   39,  40]]
Band 3
    [[31,   32,   33,   34,  35],
     [36,   37,   38,   39,  40],
     [41,   42,   43,   44,  45],
     [46,   47,   48,   49,  50]]
Band 4
    [[41,   42,   43,   44,  45],
     [46,   47,   48,   49,  50],
     [51,   52,   53,   54,  55],
     [56,   57,   58,   59,  60]]

现在我想循环遍历所有波段,以便我得到值[1,21,31,41] in first iteration and [2,22,32,42] in second iteration的数组,依此类推。我可以在R中使用指针数学和提取函数轻松地做到这一点但是在python中我无法做到这一点,因为我对python中的循环和数组索引的经验非常少。

我已尝试过StackOverflow上的一些代码

 for cell in arr:
     print cell

 for cell in arr.flat:
     print cell

 for row in arr:
    for cell in row:
         print cell

 for (i,row) in enumerate(arr):
     for (j,value) in enumerate(row):
         print value

我得到的输出不是必需的。

2 个答案:

答案 0 :(得分:1)

我认为你需要的是将相同index的像素值组合在一起。为了将相同的索引e组合在一起,请使用zip,因为bandx本身并不平坦,我们可能首先flatten然后带宽然后在展平带上执行zip

这是3个乐队的例子

band1 = np.array( [[1,    2,   3,   4,  5],
     [6,    7,   8,   9,  10],
     [11,   12,  13,  14, 15],
     [16,   17,  18,  19, 20]])
band2 = np.array([[21,   22,   23,   24,  25],
     [26,   27,   28,   29,  30],
     [31,   32,   33,   34,  35],
     [36,   37,   38,   39,  40]])
band3 = np.array([[31,   32,   33,   34,  35],
     [36,   37,   38,   39,  40],
     [41,   42,   43,   44,  45],
     [46,   47,   48,   49,  50]])
arr = [band1,band2,band3]

以下将按预期为您提供tuples数组

zip(*map(lambda x:x.flatten(),arr))

如果波段不是numpy数组而是普通的python数组,则可以执行以下操作

zip(*map(lambda x:x.flatten(),np.array(arr)))

答案 1 :(得分:1)

一种简单的方法是使用np.nditer

>>> for i in np.nditer((Band1, Band2, Band3, Band4)):
...     print(i)

打印

(array(1), array(21), array(31), array(41))
(array(2), array(22), array(32), array(42))
(array(3), array(23), array(33), array(43))
(array(4), array(24), array(34), array(44))
(array(5), array(25), array(35), array(45))
(array(6), array(26), array(36), array(46))
(array(7), array(27), array(37), array(47))
(array(8), array(28), array(38), array(48))
(array(9), array(29), array(39), array(49))
(array(10), array(30), array(40), array(50))
(array(11), array(31), array(41), array(51))
(array(12), array(32), array(42), array(52))
(array(13), array(33), array(43), array(53))
(array(14), array(34), array(44), array(54))
(array(15), array(35), array(45), array(55))
(array(16), array(36), array(46), array(56))
(array(17), array(37), array(47), array(57))
(array(18), array(38), array(48), array(58))
(array(19), array(39), array(49), array(59))
(array(20), array(40), array(50), array(60))

尽管看起来奇怪的是这个返回数组实际上使它成为一个非常酷的功能,因为它们是原始数组的视图,所以你没有将值解压缩为python类型的开销,并且这些零维数组的行为(几乎像本机python类型。