#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] … все то же значение. Может быть, это как-то связано с маской?