Python:如何沿轴线执行两个numpy 3D数据集的线性回归?

时间:2015-12-09 11:25:49

标签: python numpy linear-regression

我有两个特定区域的数据集:第一个是降雨量,第二个是该区域的植被测量值(npp)。因此,前两个维度(x,y)代表地理位置。第三个维度是时间(8个时间步长)。我想要做的是对8值降雨量的8个值与植被的8个值进行线性回归。结果应该是几个二维数组,其中对于每个位置,p值,r 2,斜率和理想情况下的残差被计算或者所有值都在3D数组中。

nppList = glob.glob(nppPath+"*.img")
rainList = glob.glob(rainPath+"*.img")

nppImg = [gdal.Open(i) for i in nppList]
rainImg = [gdal.Open(i) for i in rainList]

nppFiles = [i.ReadAsArray() for i in nppImg]
rainFiles = [i.ReadAsArray() for i in rainImg]

# get nodata
nppNodata = nppImg[1].GetRasterBand(1).GetNoDataValue()
rainNodata = rainImg[1].GetRasterBand(1).GetNoDataValue()

# convert to float and set no data
nppStack = nppStack.astype(float)
nppStack[nppStack == nppNodata] = np.nan
rainStack = rainStack.astype(float)
rainStack[rainStack == rainNodata] = np.nan

# instead of range(0,8) there should be the rainfall variable, but on a pixel base
def linReg(a):
    return stats.linregress(a, range(0, 8))

lm = np.apply_along_axis(linReg, axis=2, arr=nppStack)

我知道函数numpy.apply_along_axis()但这里的函数只能应用于一个数组。我正在寻找一种方法,可以沿着一个轴在两个数组上应用一个函数,最好不要在数组中循环。

1 个答案:

答案 0 :(得分:1)

source for scipy.stats.linregress表示只支持维度大于2的数组(并且只有在x和y数据碰巧位于同一数据结构中的情况下才会支持)。

老实说,在你的情况下我会使用Python循环 - 代码中最慢的部分不可能循环遍历数据点;相反,回归本身将决定速度。

在这种情况下,您可以展平位置轴,使用单个循环,然后将回归结果重新整形为3D。类似的东西:

n = nx * ny
frain = rainStack.reshape((n, 8))
fnpp = nppStack.reshape((n, 8))
reg_results = np.empty((n,5))
for i in range(n):
    reg_results[i] = stats.linregress(frain[i], fnpp[i])
reg_results[i].reshape((nx,ny,8))    # back to 3D