从scipy频率矩阵和值数组创建一个“虚拟”numpy数组

时间:2017-02-10 19:43:31

标签: python numpy scipy sparse-matrix

我有 M W 频率矩阵doc_word_freqs表示 w 字出现在文档中的次数m 在一个scipy CSR矩阵中。我还有一个 W - 维向量z_scores,其中一些值与每个单词相关联(在我的特定情况下,每个单词的两个子集之间的对数比率的z得分) ,但这与问题没有密切关系。)

我想计算每个文档的z分数集的一些度量(在这种情况下,方差)。就是这样:

np.var(doc_z_scores, axis=1)

其中doc_z_scores M 行,每行包含文档 m 中每个单词的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])

有没有办法在没有实际创建差异数组(或者可能是其他任何措施)的情况下做到这一点?

1 个答案:

答案 0 :(得分:1)

我不是100%确定我正确理解你的问题。你可以使用矩阵向量乘法:

conf

对于“无偏见”的方差,请在适当的时候使用weight = (doc_word_freqs @ np.ones_like(word_z_scores)).A.ravel() mean = (doc_word_freqs @ word_z_scores).A.ravel() / weight raw_2nd = (doc_word_freqs @ (word_z_scores**2)).A.ravel() variance = raw_2nd / weight - mean**2