grass.script+scipy-tielsen回归斜率和两个光栅值之间的截距



我需要计算GRASS GIS python脚本中两个光栅值之间的TheilSen回归斜率和截距。本例中的两个光栅(织物和ytile(都具有相同的尺寸250x250像素,并且包含nodata(null(值。到目前为止,我只使用了grass.script,所以我是scipy的新手。我试着阅读了一些教程,并在此基础上,我在命令行上尝试了以下代码:

>>> from scipy import stats
>>> import grass.script as grass
>>> import grass.script.array as garray
>>> x = garray.array(mapname="xtile")
>>> y = garray.array(mapname="ytile")
>>> res_list = stats.theilslopes(y, x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/scipy/stats/_stats_mstats_common.py", line 214, in theilslopes
deltax = x[:, np.newaxis] - x
MemoryError

显然,事情不会这么简单。编辑:我去掉了关于数组维度问题的想法,我错了。现在看来250x250的阵列尺寸太大了。是这样吗?知道如何逃避吗?

然后似乎还有另一个问题。当我尝试打印数组x时,

>>> print x
[[  0.   0.   0. ...   0.   0.   0.]
[  0.   0.   0. ...   0.   0.   0.]
[  0. 402.   0. ...   0.   0.   0.]
...
[  0.   0.   0. ...   0.   0.   0.]
[  0.   0.   0. ...   0.   0.   0.]
[  0.   0.   0. ...   0.   0.   0.]]

看起来光栅中的所有nodata值都以零的形式读取到数组中。在所讨论的光栅中,存在大多数nodata(或GRASS中命名的null(像素,这些像素在回归中应被忽略,即如果光栅x或y中的任何值都是nodata,则在回归计算中不应使用相应的x,y数据对。是否可以在数组中定义nodata值,以便以所描述的方式直接忽略这些值,或者是否需要首先从数组对中筛选出nodata对?

谢谢。

我不确定回答自己的问题是否合适,但也许这对其他有类似问题的人有用。

我终于能够让它发挥作用了。工作(即它计算一些东西(修改的例子解决了原始问题中提到的两个问题:

>>> from scipy import stats
>>> import grass.script as grass
>>> import grass.script.array as garray
>>> x = garray.array(mapname="xtile").reshape(-1)
>>> y = garray.array(mapname="ytile").reshape(-1)
>>> # Now the null raster values are changed to zeroes. 
>>> # Let us filter them out by pairs of x, y values for any pair which contains a zero value.
>>> xfiltered = np.array([])
>>> yfiltered = np.array([])
>>> i = 0
>>> for xi in np.nditer(x):
...    if x[i] > 0:
...       if y[i] > 0:
...          xfiltered = np.append(xfiltered, [x[i]])
...          yfiltered = np.append(yfiltered, [y[i]])
...    i += 1
... 
>>> # Compute the regression.
>>> res_list = stats.theilslopes(yfiltered, xfiltered)
>>> res_list
(0.8738738738738738, -26.207207207207148, 0.8327338129496403, 0.9155844155844156)

解释:在回归计算之前,我过滤掉了原始光栅中没有数据的所有零值(可能还有负值,不应该有,如果有,那就意味着有缺陷的数据——数据的物理意义是量化反射率(。正如我用测试数据进行实验验证的那样,对定子轮廓斜率来说,使用整形是不必要的,但它使两个阵列的滤波变得更容易。

现在,我仍然不确定为什么需要进行过滤才能使stats.profile斜率无错误地完成(尽管数据中的所有零都是错误的(。过滤掉零可能只是让集合足够小,可以放入内存,但我不这么认为。我认为大多数零值使得无法计算x,y点对的中值斜率,因为如果大多数点都有相同的x,y值,那么它们对的大多数点也有未定义的斜率,中值大约是大多数。但它可能完全是另一回事。

此外,由于我不是很熟练的Python程序员,也许我这样做的方式不是最有效的。其他人可以纠正这一点。

最后一点,如果y是因变量,x是自变量,我可能会把x和y的数据颠倒过来。直觉上,我觉得它们应该是y,x的顺序,但我在所有的教程和文档中看到,它总是x,y。我把它留在原来的问题中,因为在某些情况下,你可以搜索反公式x=f(y(回归线,而这不是我试图解决的问题的一部分。

最新更新