Я работаю над набором данных ансамбля погоды, в котором у меня есть трехмерный массив (N, X, Y), где X и Y - широта и долгота, а N - индекс члена ансамбля.
Я являюсьиспользование scipy.ndimage.percentile_filter () для получения значений процентилей для набора данных с использованием (N, j, k) отпечатка по данным, где N = количество членов, а j, k - некоторое целое число в диапазоне 1 <= j <=9. </p>
Итак:
from scipy import ndimage
num_members=11
x=17
y=24
kx=3
ky=3
kernel = np.ones((num_members,kx,ky))
a = np.random.randint(100, size=(num_members,x,y))
result = ndimage.percentile_filter(ascent, 80, footprint=kernel, mode='mirror')]
Теперь:
result[int(num_members/2)]
- это новый массив (X, Y), содержащий 80-й процентиль (N, j,k) куб вокруг каждого элемента массива.
Я сейчас пытаюсь сделать что-то подобное, чтобы получить вероятность превышения порога. Мой существующий код проходит по основному трехмерному массиву (в X и Y), выделяя вложенный куб (N, j, k), используя цикл for, а затем передает вложенный куб в функцию, которая возвращает вероятность. Выходными данными является двумерный массив (X, Y) вероятности.
Итак:
import numpy as np
import pandas as pd
def getProbability(arr, mode, threshold):
# Calculate probability of exceedence of threshold in arr
sampleLen = float(len(arr))
if(mode == 'above'):
mWhere = np.array(np.where(arr > threshold)).reshape(-1)
if(mode == 'below'):
mWhere = np.array(np.where(arr < threshold)).reshape(-1)
mW = float(len(mWhere))
pb = mW / sampleLen
return pb;
def getSubStack(df, x, y, radius=4):
# Extract a substack of 'radius' centred on x,y from df
# Embedded housekeeping not shown here
sx = x - radius
sy = y - radius
ex = x + radius + 1
ey = y + radius + 1
subdf = df[:,sx:ex,sy:ey]
return subdf;
# Some pandas method to import dataset as a dataframe (N,X,Y)
dataset = importData()
for j in range(X):
for k in range(Y):
arr = getSubStack(dataset, j, k, 3)
prob[j,k] = getProbability(arr, 'above', 27)
Это происходит очень медленно, особенно там, где lat, lon ~ = 1000.
Мой вопрос заключается в том, есть ли в scipy похожий метод для выполнения отпечатка моего набора данных и передачи полученного вложенного куба в мою функцию getProbability ()? Или у Сципи есть метод вероятности превышения, который мне не удалось найти?