Проблема: Я перебираю матрицу 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