Как векторизовать (то есть удалить для l oop из) этот фрагмент кода, который генерирует дискретный PDF из временного ряда - PullRequest
1 голос
/ 16 апреля 2020

Я пишу функцию, которая выполняет следующую задачу:

Он принимает временной ряд из N точек X [i] и выдает PDF p: [X_min, X_max] -> R, который является кусочно-постоянной на каждом из M одинаково расположенных «бинов» [X_min, X_min + delta], [X_min + delta, X_min + 2 * delta], ..., [X_max - delta, X_max] (так delta = (X_max- X_min) / M), и это указывает, как долго временной ряд проводит в каждом бине. Точнее, он создает массив P с P [i] = # {k: X [k] \ in [X_min + i * delta, X_min + i * (delta + 1)]}} / N.

Таким образом, моя функция принимает в качестве входных данных numpy массив X = [X [0], ..., X [N-1]] длины N вместе с числом M, указывающим, сколько бинов, и выдает в качестве выходных данных a numpy массив P = [P [0], ..., P [M-1]] длины M и размера 1.

Пока мой код полагается на a для l oop, и выглядит следующим образом:

import numpy as np
def func(X,M):
    N=np.size(X)
    P = np.array([0]*M)
    X_min = np.amin(X)
    X_max = np.amax(X)
    delta = (X_max - X_min)/M
    for k in np.arange(N):
        j = int( (X[k]-X_min) // delta )
        P[j] += 1
    P = P / N
    return P

Мне нужно много раз использовать эту функцию в вычислениях с большими массивами, и мой друг посоветовал мне значительно ускорить процесс за счет векторизации, а скорее чем использовать для l oop. Я могу видеть, как векторизовать первую часть l oop, определив «вектор счета» J = ((X-X_min) // delta).astype(int) длины N, который указывает, какому бину принадлежит каждый элемент временного ряда, но тогда я не уверен, как реализовать вторую часть (то есть построить вектор P из J, так что P [i] подсчитывает количество вхождений целого числа i в J), не отступая при a для l oop.

Кто-нибудь У вас есть идеи по поводу способов эффективного кодирования того, что я хочу, используя существующие векторизованные функции или иным образом?

Большое спасибо! А.

1 Ответ

1 голос
/ 16 апреля 2020

Мы можем заменить часть l oop на np.bincount -

P = np.bincount(((X-X_min) // delta).astype(int), minlength=M)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...