Python 在三维阵列上映射scipy百分位数

Python 在三维阵列上映射scipy百分位数,python,arrays,numpy,Python,Arrays,Numpy,我试图利用几年的数据,计算最近一年的百分位值。我最终使用的数组是一个3D数组arr,其形状(5851386,3)=(lat,lon,year)为erc值 如果我理解正确的话,对于每一个(横向、纵向)组合,您想要去年值与所有年份值相比的百分位数?所以你可以这样做: def(x): 返回统计数据。百分位数分数(x,x[-1]) res=np。沿_轴(f,2,arr)应用_ 您的错误意味着您在位置参数之前提供了一个关键字参数,即*args应该在**kwargs之前。添加传递arr变量的参数名,即arr

我试图利用几年的数据,计算最近一年的百分位值。我最终使用的数组是一个3D数组
arr
,其形状(5851386,3)=(lat,lon,year)为erc值


如果我理解正确的话,对于每一个(横向、纵向)组合,您想要去年值与所有年份值相比的百分位数?所以你可以这样做:

def(x):
返回统计数据。百分位数分数(x,x[-1])
res=np。沿_轴(f,2,arr)应用_

您的错误意味着您在位置参数之前提供了一个关键字参数,即
*args
应该在
**kwargs
之前。添加传递
arr
变量的参数名,即
arr\u per=np。沿_轴应用_(stats.percentileofscore(),axis=2,arr=arr)
此外,当将函数传递给另一个函数时,不要包含括号,或者传递的是函数的结果,而不是函数本身。do
arr\u per=np。沿轴应用(stats.percentileofscore,axis=2,arr=arr)
这修复了第一个错误,但我仍然有percentileofscore的参数问题。。。下一个错误是TypeError:percentileofscore()缺少1个必需的位置参数:“score”。我感到困惑的部分是如何将其编码为该部分的最后一个元素…无法100%确定您试图从您的问题中做什么-您可以发布一个示例输入和预期输出吗?不一定是完整的数组,只是一个子类,你想得到过去几年的百分位数?或者只取去年的值并正常化?事实上,我错了。。。出于某种原因,它将
res
输出为具有正确维度的数组,但所有元素都相同。我还在想为什么。。。输入数组没有问题。如果你可以在问题中发布数组的一小部分,例如,
arr[:5,:4,:]
,有预期的输出?假设我有
a=np.shape((3,3,3))
,我可以手动制作看起来像[0,0,:],a[0,1,:],a[0,2,:],a[1,0,:]的片段,等等。如果我将所有这些作为1D数组添加到列表中,我可以使用for循环:
for list中的x:p1=percentileofscore(x,x[-1])
。我想要一个
res=([p1,p2,p3],[p4,p5,p6],[p7,p8,p9])
的输出。这为我提供了各种res值。一些关于如何使用np.apply_沿_轴的应用程序,函数不会被更新的问题,我给出的代码应该正好做到这一点。在不知道您的一些输入数据以及实际和预期结果的情况下,我无法帮助您。我使用的数组有一个掩码,因此它看起来很奇怪…深入研究一下,我将年度数组连接在一起的方式可能有问题;使用上面定义的整数day,我有
erc=nc.变量['energy\u release\u component-g'][day,:,:]
后跟
array\u list.append(erc)
然后
arr=np.dstack(array\u list)
我从切片arr[200:205500:505,:]得到的输出只是[[3267632676]…都是相同的值。可能与面具有关?
array_list = []

data = 'erc_1979.nc'
files = sorted(glob.glob('erc_*'))

for x, f in enumerate(files):
    
    nc = Dataset(data, mode = 'r')   
    erc = nc.variables['energy_release_component-g'][:]
    nc.close()
    array_list.append(erc)

arr = np.ma.concatenate(array_list, axis=0) #makes 3D array

###calculate percentiles 
def f(x):
    return percentileofscore(x, x[-1])

res = np.apply_along_axis(f, 0, arr)