Сопоставление scipy percentileofscore с 3D-массивом

#python #arrays #numpy

#python #массивы #numpy

Вопрос:

Я пытаюсь взять данные за несколько лет и вычислить процентиль значения за самый последний год. Массив, с которым я в конечном итоге работаю, представляет собой 3D-массив arr с формой (585, 1386, 3)= (широта, лон, год) со значением 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)
  

Комментарии:

1. ваша ошибка означает, что вы предоставляете аргумент ключевого слова перед позиционным аргументом, т. Е. *args должен идти перед **kwargs . добавьте имя параметра, которому вы передаете arr переменную, т.е. arr_per = np.apply_along_axis(stats.percentileofscore(), axis=2, arr=arr)

2. кроме того, когда вы передаете функцию другой функции, не включайте круглые скобки, иначе вы передаете результат функции, а не саму функцию. do arr_per = np.apply_along_axis(stats.percentileofscore, axis=2, arr=arr)

3. Это исправляет первую ошибку, но у меня все еще есть проблема с аргументами для percentileofscore… следующая ошибка — TypeError: в percentileofscore() отсутствует 1 требуемый позиционный аргумент: ‘оценка’. Часть, в которой я запутался, заключается в том, как закодировать это как последний элемент этого фрагмента…

4. не на 100% уверен, что вы пытаетесь сделать из своего вопроса — не могли бы вы опубликовать пример ввода и ожидаемый результат? не обязательно должен быть полный массив, только подмножество

5. Вы пытаетесь получить процентиль прошлого года по сравнению с предыдущими годами? Или взять только прошлогодние значения и нормализовать?

Ответ №1:

Если я вас правильно понимаю, для каждой комбинации (широта, длина) вам нужен процентиль прошлогоднего значения по сравнению со значениями всех лет? Итак, вы можете сделать что-то вроде этого:

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

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

Комментарии:

1. На самом деле, я был неправ… по какой-то причине он выводится res как массив с правильными размерами, но все элементы одинаковы. Я все еще пытаюсь понять, почему … с входным массивом все в порядке

2. может быть, вы можете опубликовать небольшую часть своего массива в вопросе, например arr[:5, :4, :] , с ожидаемыми результатами?

3. допустим, у меня есть 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 функция не обновляется

4. Приведенный мной код должен делать именно это. Не зная некоторых ваших входных данных и каковы фактические и ожидаемые результаты, я не могу вам помочь.

5. Массив, который я использую, имеет маску, поэтому это выглядит довольно странно … немного покопавшись, может быть что-то не так с тем, как я объединяю годовые массивы вместе; используя 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] … все то же значение. Может быть, это как-то связано с маской?