Я пишу функцию, которая выполняет следующую задачу:
Он принимает временной ряд из 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.
Кто-нибудь У вас есть идеи по поводу способов эффективного кодирования того, что я хочу, используя существующие векторизованные функции или иным образом?
Большое спасибо! А.