我有一個中號通過W¯¯頻率矩陣doc_word_freqs
表示倍字的數w出現在文檔米在SciPy的CSR矩陣。我也有一個W維矢量z_scores
與一些值與每個單詞相關聯(在我的具體情況下,一個語料庫的兩個子集之間的每個單詞的對數比率的z-分數,但這與問題沒有密切關係)。創建「虛擬」 numpy的從SciPy的頻率矩陣和值數組陣列
我想計算每個文檔的一組z值的一些度量(在這種情況下,方差)。也就是說,這樣的:
np.var(doc_z_scores, axis=1)
其中doc_z_scores
有中號行,每行包含在文件米 z分數爲每個單詞的列表。這是我現在有,但它是相當不雅的速度很慢:
docs = [[]] * doc_word_freqs.shape[0] # Make a list of M empty lists
for m, w in zip(*doc_word_freqs.nonzero()):
# For each non-zero index in doc_word_freqs, append the
# the z-score of that word the appropriate number of times
for _ in range(doc_word_freqs[m, w]):
docs[m].append(word_z_scores[w])
# Calculate the variance of each of the resulting lists and return
return np.array([np.var(m) for m in docs])
是否有某種方式來做到這一點,而不實際創建差異(或任何其他措施可能是)的陣列?
我能夠通過細分方差計算來優化事物,並且僅爲每個文檔字對(僅限非零頻率的對)計算'abs(z_score - doc_mean)** 2'一次。這大大加快了速度,但我仍然很想知道是否有辦法做到這一點,而不需要預先了解未來的操作。 – err1100