【问题标题】:Mapping scipy percentileofscore over a 3D array在 3D 数组上映射 scipy percentileofscore
【发布时间】:2020-09-13 23:38:16
【问题描述】:

我正在尝试获取几年的数据并计算最近一年价值的百分位数。我最终使用的数组是一个 3D 数组 arr,其形状 (585, 1386, 3)=(lat, lon, year) 的值 erc

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)

【问题讨论】:

  • 你的错误意味着你在位置参数之前提供了一个关键字参数,即*args应该在**kwargs之前。添加要传递arr 变量的参数名称,即arr_per = np.apply_along_axis(stats.percentileofscore(), axis=2, arr=arr)
  • 另外,当你将一个函数传递给另一个函数时,不要包含括号,或者你传递的是函数的结果,而不是函数本身。做arr_per = np.apply_along_axis(stats.percentileofscore, axis=2, arr=arr)
  • 这修复了第一个错误,但我仍然有 percentileofscore 的参数问题...下一个错误是 TypeError: percentileofscore() missing 1 required positional argument: 'score'。我感到困惑的部分是如何将其编码为该切片的最后一个元素...
  • 不是 100% 确定你想从你的问题中做什么 - 你能发布一个示例输入和预期输出吗?不必是完整的数组,只是一个子集
  • 您是否要获取去年与前几年相比的百分位数?还是只取去年的值并正常化?

标签: python arrays numpy


【解决方案1】:

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

def f(x):
    return stats.percentileofscore(x, x[-1])

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

【讨论】:

  • 实际上,我错了......由于某种原因,它输出res 作为具有正确尺寸的数组,但所有元素都是相同的。我仍在试图弄清楚为什么......输入数组没有任何问题
  • 也许您可以在问题中发布一小部分数组,例如arr[:5, :4, :],有预期的输出吗?
  • 假设我有 a=np.shape((3,3,3)),我可以手动制作看起来像 a[0,0,:], a[0,1,:], a[0,2, :]、a[1,0,:] 等。如果我将所有这些作为一维数组添加到列表中,我可以使用 for 循环:for x in list: p1 = percentileofscore(x, x[-1])。我想要res = ([p1,p2,p3],[p4,p5,p6],[p7,p8,p9]) 的输出。这给了我各种 res 的值。一些如何使用 np.apply_along_axis 函数没有被更新
  • 我给出的代码应该可以做到这一点。在不知道您的一些输入数据以及实际和预期结果是什么的情况下,我帮不了您。
  • 我正在使用的数组有一个掩码,所以它看起来很奇怪......深入研究一下,我将年度数组连接在一起的方式可能有问题;使用 day 作为上面定义的整数,我有 erc = nc.variables['energy_release_component-g'][day,:,:] 后跟 array_list.append(erc) 然后 arr = np.dstack(array_list) 我从切片 arr[200:205,500:505,:] 的输出只是 [[32676,32676,32676].. .所有相同的值。可能和面具有关?
猜你喜欢
  • 2020-01-06
  • 2018-06-23
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多