Numy массив векторизованное пересечение - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть трехмерный массив numy, который представляет user id, полученный из моего классификатора с формой (NxKxM), и я хотел бы вычислить индекс jaccard (пересечение len / len union), чтобы проверить соотношение перекрытия во время моего groupkfold. Мне нужно вычислить эту функцию по оси N (число гиперпарамов) и M (число или итераций), тогда как K - это число сгибов CV. Я хотел бы иметь что-то вроде:

A [0] [0] [:] сравнивается с A [1:] [:] [:], A [0] [1] [:] сравнивается с A [1:] [:] [ :] и A [0] [2] [:] сравниваются с A [1:] [:] [:] для первого уровня и так далее итеративно. (в случае k = 3)

Я пытался использовать вложенный цикл, но, конечно, код очень медленный, до сих пор у меня такая ситуация:

for elem in range(len(total_users_splits)):
    for subelem in range(elem+1,len(total_users_splits)):
        for i in range(n_splits):
            for j in range(n_splits):
                first = b[elem][i]
                second = b[subelem][j]
                total_num = len(np.union1d(first,second))
                intersect_len = len(np.intersect1d(first,second))
                X.append(intersect_len/total_num)
overlap = {'overlap_ratio_mean_uids':np.nanmean(X),
           'overlap_ratio_std_uids':np.nanstd(X),
           'overlap_ratio_max_uids':np.max(X),
           'overlap_ratio_min_uids':np.min(X)}

total_user_splits - это список измерения NxM, а n_splits - это k.

Код действительно медленный, но я не знаю, как применить np.intersect векторизованным способом

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