Как увеличить скорость при сохранении памяти с массивными массивами? - PullRequest
1 голос
/ 02 июля 2019

Мне нужно написать код для проведения t-теста с одной выборкой, учитывая среднее значение выборки (E (X)) и второй необработанный момент выборки (E (X ^ 2)) для каждой записи в 2-мерном массиве,

Есть два способа, которыми я делаю это, но оба они не совсем работают.

  1. В случае с множественными проверенными операциями - ошибка нехватки памяти для определенных размеров массива.
def calc_normal_pvals(vt_sum_counter, vt_ssum_counter):
    global nsubs
    vt_sum_counter = vt_sum_counter/nsubs
    vt_ssum_counter = vt_ssum_counter/nsubs
    sample_var = nsubs * (vt_ssum_counter - np.square(vt_sum_counter))/(nsubs - 1)
    t_array = np.divide(vt_sum_counter, (np.sqrt(sample_var/nsubs)))
    pvals = t.sf(t_array, nsubs-1)
    pvals[np.isnan(pvals)] = 0
    return pvals
Обычный для метода цикла - в сравнении занимает много времени
def calc_normal_pvals(vt_sum_counter, vt_ssum_counter, tail=1):
    global nsubs
    V, T = vt_sum_counter.shape
    pvals = np.zeros((V, T))
    for i in range(V):
        for j in range(T):
            sigma = ((vt_ssum_counter[i, j]/nsubs -(vt_sum_counter[i,j]/nsubs)**2)/(nsubs - 1))**0.5
            if (sigma != 0):
                pvals[i, j] = t.sf(vt_sum_counter[i, j]/(nsubs*sigma), nsubs-1)
    return pvals

Массивы ввода огромны - обычно размером ~ 900000 X 400.

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