Numpy цикл nxn матрицы за O (n) время - PullRequest
0 голосов
/ 24 апреля 2020

Проблема: Я перебираю матрицу mxn и изменяю значение, расположенное в этой позиции. Я не хочу знать, есть ли способ сократить количество выполнений, которые могут потребоваться?

Вот как я сейчас это делаю O (n ^ 2):

matrix = [[1,2,3], [1,2,3], [1,2,3]]
range_from_len = range(len(matrix))

for row in range_from_len:
    for column in range_from_len:
        matrix[row][column] = some_func(matrix[row], matrix[column])

Я читал о чем-то вроде numpy, который известен как более производительный для операций на основе матриц, но мой идеал - O (n) l oop, который дает пару индексов как:

for row, column in some_magic(matrix):
    matrix[row][column] = some_func(matrix[row], matrix[column])

ФУНКЦИИ * АКТУАЛЬНЫЕ

def build_similarity_matrix(sentences, stopwords):
    sentences_len = len(sentences)
    sentences_len_range = range(sentences_len)
    summary_matrix = np.zeros((sentences_len, sentences_len))

    for row in sentences_len_range:
        for column in sentences_len_range:
            if row != column:
                summary_matrix[row][column] = sentence_similarity(
                    sentences[row],
                    sentences[column],
                    stopwords
                )

    return summary_matrix


def sentence_similarity(sentence_a, sentence_b, stopwords):
    a_tokenized = [w.lower() for w in sentence_a]
    b_tokenized = [w.lower() for w in sentence_b]

    all_words = list(set(a_tokenized + b_tokenized))
    all_words_len = len(all_words)

    vector_a = [0] * all_words_len
    vector_b = [0] * all_words_len

    for w in a_tokenized:
        if w not in stopwords:
            vector_a[all_words.index(w)] += 1

    for w in b_tokenized:
        if w not in stopwords:
            vector_b[all_words.index(w)] += 1

    return 1 - cosine_distance(vector_a, vector_b)

Примечание: косинусное расстояние от nltk

...