найти минимальный подмассив хи-квадрат между двумя массивами в numpy - PullRequest
0 голосов
/ 18 февраля 2019

Мне нужен метод, чтобы найти минимальную пару хи-квадрат между двумя одномерными массивами.Например, один массив

a = np.array([1, 2, 3])

другой массив

b = np.array([0.9, 1, 3.5, 4.5])

Нам нужно найти подмассив в b с такой же длиной a, как

sub_b = np.array([0.9, 1, 3.5])

обратите внимание, что sub_b не должен включать дублирующиеся элементы.

И найти ближайшую пару между двумя массивами.Мы выбираем chi-square = sum((a - sub_b)**2) / len(a).Итак, нам нужно найти sub_b с минимальным хи-квадратом.

Я использую iteration.permutations, чтобы найти все перестановки sub_b, а затем найти минимальный хи-квадрат.

from itertools import permutations

def find_chi2_array(b, a):
    chi2 = lambda x: sum((x-a)**2) / len(a)
    perm = np.array(list(permutations(b, len(a))))
    chi2_results = np.apply_along_axis(chi2, 1, perm)
    return chi2_results.min(), candidates[chi2_results.argmin()]

Но этот метод очень глуп, и когда длина b увеличивается, память быстро истощается.

Если я использую цикл for в чистом Python,скорость слишком низкаяМожет у кого-нибудь есть более эффективный и менее емкий метод памяти?

def find_chi2_array_slow(b, a):
    chi2 = lambda x: sum((x-a)**2) / len(a)
    n = 0
    for perm in permutations(b, len(a)):
        perm = np.array(perm)
        n += 1
        if n == 1:
            chi2_result = chi2(perm)
        elif chi2_result > chi2(perm):
            chi2_result = chi2(perm)
    return chi2_result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...