获取 Python 中二维数组的索引
Get Index of 2D array in Python
我使用 gdal 模块中的 osgeo 来处理地理栅格数据。
#Get size of input raster (cols, rows)
cols = ds.RasterXSize #3531
rows = ds.RasterYSize #3314
为了读取所有数据,我创建了一个数组:
data = band.ReadAsArray(0, 0, cols, rows).astype(float)
ReadAsArray 的结果是一个二维 numpy 数组。直到这里它才有效。
因此,为了进一步对该栅格中的每个像素应用地理变换,我需要每个像素的列索引和行索引。我想我可能需要一个 numpy 函数来读出它,但我不知道它如何处理二维数组。
我可以通过简单地调用它的索引(例如 band[0][1])来访问数组中的项目,但是我需要将整个列索引和整个行索引分别存储在例如col_idx 和 row_idx.
我尝试过类似的方法,但没有成功:
for idx, val in enumerate(ints):
print idx, val
感谢任何帮助!
你可以使用numpy.meshgrid
i, j = numpy.meshgrid(range(ncols), range(nrows))
result = f(data, i, j)
例子
In [28]: nrows = 2 ; ncols = 4
In [29]: icol, irow = np.meshgrid(range(ncols),range(nrows))
In [30]: def a(r,c): return 100*r+c
In [31]: a(irow, icol)
Out[31]:
array([[ 0, 1, 2, 3],
[100, 101, 102, 103]])
In [32]:
数据是 XXXL?
在这种情况下,您可以在数组的行上使用 for 循环,而不是使用行和列索引生成两个大矩阵(它 较慢 但不是像双 for 循环一样慢)
icol = range(ncols)
for irow, row in enumerate(data):
if irow>0:
result = np.vstack((result, f(row, irow, icol)))
else:
result = f(row, irow, icol)
我使用 gdal 模块中的 osgeo 来处理地理栅格数据。
#Get size of input raster (cols, rows)
cols = ds.RasterXSize #3531
rows = ds.RasterYSize #3314
为了读取所有数据,我创建了一个数组:
data = band.ReadAsArray(0, 0, cols, rows).astype(float)
ReadAsArray 的结果是一个二维 numpy 数组。直到这里它才有效。
因此,为了进一步对该栅格中的每个像素应用地理变换,我需要每个像素的列索引和行索引。我想我可能需要一个 numpy 函数来读出它,但我不知道它如何处理二维数组。
我可以通过简单地调用它的索引(例如 band[0][1])来访问数组中的项目,但是我需要将整个列索引和整个行索引分别存储在例如col_idx 和 row_idx.
我尝试过类似的方法,但没有成功:
for idx, val in enumerate(ints):
print idx, val
感谢任何帮助!
你可以使用numpy.meshgrid
i, j = numpy.meshgrid(range(ncols), range(nrows))
result = f(data, i, j)
例子
In [28]: nrows = 2 ; ncols = 4
In [29]: icol, irow = np.meshgrid(range(ncols),range(nrows))
In [30]: def a(r,c): return 100*r+c
In [31]: a(irow, icol)
Out[31]:
array([[ 0, 1, 2, 3],
[100, 101, 102, 103]])
In [32]:
数据是 XXXL?
在这种情况下,您可以在数组的行上使用 for 循环,而不是使用行和列索引生成两个大矩阵(它 较慢 但不是像双 for 循环一样慢)
icol = range(ncols)
for irow, row in enumerate(data):
if irow>0:
result = np.vstack((result, f(row, irow, icol)))
else:
result = f(row, irow, icol)