Используйте scipy или подобное для вычисления вероятности превышения в вложенном кубе трехмерного массива - PullRequest
0 голосов
/ 21 октября 2019

Я работаю над набором данных ансамбля погоды, в котором у меня есть трехмерный массив (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 ()? Или у Сципи есть метод вероятности превышения, который мне не удалось найти?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...