如何将一个函数中生成的numpy.ndarray输出用作另一个函数的输入?

时间:2013-07-23 02:51:21

标签: python arrays numpy gdal multidimensional-array

首先,这是脚本:

import numpy as np
import osgeo.gdal
import os

ArbitraryXCoords = np.arange(435531.30622598,440020.30622598,400)
ArbitraryYCoords = np.arange(5634955.28972479,5638945.28972479,400)

os.chdir('/home/foo/GIS_Summer2013')
dataset = osgeo.gdal.Open("Raster_DEM")
gt = dataset.GetGeoTransform()

def XAndYArrays(spacing):
    XPoints = np.arange(gt[0], gt[0] + dataset.RasterXSize * gt[1], spacing)
    YPoints = np.arange(gt[3] + dataset.RasterYSize * gt[5], gt[3], spacing)
    return (XPoints, YPoints)

def RasterPoints(XCoords,YCoords):
    a=[]
    for row in YCoords:
        for col in XCoords:
            rasterx = int((col - gt[0]) / gt[1])
            rastery = int((row - gt[3]) / gt[5])
            band = int(dataset.GetRasterBand(1).ReadAsArray(rasterx,rastery, 1, 1)[0][0])
            a[len(a):] = [band]
    foo = np.asarray(a)
    bar = foo.reshape(YCoords.size,XCoords.size)
    return bar

当我加载上面显示的脚本时,我无法使用函数XAndYArrays的输出作为函数RasterPoints中的输入。但我可以使用我手动定义的numpy.ndarray作为函数RasterPoints中的输入。但这还不够好。我需要能够使用XAndYArrays的输出作为RasterPoints中的输入。 以下是我在PyDev交互式控制台上使用的命令:

>>> Eastings,Northings = XAndYArrays(400)
>>> Eastings
Out[1]: 
array([ 435530.30622598,  435930.30622598,  436330.30622598,
        436730.30622598,  437130.30622598,  437530.30622598,
        437930.30622598,  438330.30622598,  438730.30622598,
        439130.30622598,  439530.30622598,  439930.30622598])
>>> Northings
Out[1]: 
array([ 5634954.28972479,  5635354.28972479,  5635754.28972479,
        5636154.28972479,  5636554.28972479,  5636954.28972479,
        5637354.28972479,  5637754.28972479,  5638154.28972479,
        5638554.28972479,  5638954.28972479])
>>> RasterPoints(Eastings, Northings)
ERROR 5: MergedDEM_EPSG3159_Reduced, band 1: Access window out of range in RasterIO().  Requested (0,246) of size 1x1 on raster of 269x246.
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/IPython/core/interactiveshell.py", line 2538, in run_code
    exec code_obj in self.user_global_ns, self.user_ns
  File "<ipython-input-1-326be9918188>", line 1, in <module>
    RasterPoints(Eastings, Northings)
  File "/home/foo/GIS_Summer2013/src/22July_StackOverflowQuestion.py", line 23, in RasterPoints
    band = int(dataset.GetRasterBand(1).ReadAsArray(rasterx,rastery, 1, 1)[0][0])
TypeError: 'NoneType' object has no attribute '__getitem__'
>>> RasterPoints(ArbitraryXCoords, ArbitraryYCoords)
Out[1]: 
array([[422, 422, 431, 439, 428, 399, 410, 395, 398, 413, 409, 386],
       [414, 428, 421, 430, 426, 403, 409, 410, 406, 408, 412, 406],
       [420, 428, 427, 424, 408, 406, 428, 420, 408, 410, 409, 420],
       [392, 418, 426, 430, 414, 428, 430, 418, 433, 414, 402, 399],
       [400, 411, 420, 406, 401, 405, 398, 420, 419, 400, 401, 414],
       [408, 421, 418, 428, 399, 398, 405, 412, 421, 406, 395, 397],
       [399, 404, 398, 401, 400, 399, 399, 398, 398, 419, 399, 395],
       [401, 410, 407, 407, 404, 400, 398, 397, 397, 399, 400, 398],
       [400, 410, 418, 405, 401, 400, 397, 398, 400, 398, 397, 396],
       [389, 387, 399, 408, 423, 400, 407, 398, 411, 408, 410, 420]])
>>> print "partial success"
partial success

1 个答案:

答案 0 :(得分:0)

您正在尝试读取不存在的像素位置,因为它位于栅格尺寸之外。

尝试使用以下方法计算您的Ypoints:

YPoints = np.arange(gt[3] + (ds.RasterYSize-1) * gt[5], gt[3], abs(gt[5]))

你的RasterPoints功能真的很糟糕。您当时正在访问所有数组值1,将它们存储在列表中,然后创建一个数组。这毫无意义。

此外,我认为在SO开启另一个问题之前关闭/解决之前的问题的良好做法。