Python numpy csr矩阵“平均值”函数是否对所有矩阵进行平均?如何删除某个值?
我有一个numpy csr矩阵,我想得到它的平均值,但它包含很多零,因为我消除了主对角线上和主对角线下的所有值,只取了上面的三角形值,现在我的csr矩阵在转换为数组时如下所示:Python numpy csr矩阵“平均值”函数是否对所有矩阵进行平均?如何删除某个值?,python,numpy,matrix,mean,Python,Numpy,Matrix,Mean,我有一个numpy csr矩阵,我想得到它的平均值,但它包含很多零,因为我消除了主对角线上和主对角线下的所有值,只取了上面的三角形值,现在我的csr矩阵在转换为数组时如下所示: 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0.63646664 0.34827262
0.24316454 0.1362165 0.63646664 0.15762204 0.31692202 0.12114576
0.35917146
据我所知,零对于csr矩阵的工作和显示非常重要:
(0,5) 0.5790418
(3,10) 0.578210
(5,20) 0.912370
(67,5) 0.1093109
我看到csr矩阵有它自己的,但这是否意味着该函数考虑了所有的零,因此除以数组中包括零的元素数?因为我只需要非零值的平均值。我的矩阵包含多个向量之间的相似性,更像是一个矩阵列表,类似于:
[[ 0. 0.63646664 0.48492084 0.42134077 0.14366401 0.10909745
0.06172853 0.08116201 0.19100626 0.14517247 0.23814955 0.1899649
0.20181049 0.25663533 0.21003358 0.10436352 0.2038447 1.
0.63646664 0.34827262 0.24316454 0.1362165 0.63646664 0.15762204
0.31692202 0.12114576 0.35917146]
[ 0. 0. 0.58644824 0.4977052 0.15953415 0.46110612
0.42580993 0.3236768 0.48874263 0.44671607 0.59153001 0.57868948
0.27357541 0.51645488 0.43317846 0.50985032 0.37317457 0.63646664
1. 0.51529235 0.56963948 0.51218525 1. 0.38345582
0.55396192 0.32287605 0.46700191]
[ 0. 0. 0. 0.6089113 0.53873289 0.3367261
0.29264493 0.13232082 0.43288206 0.80079927 0.37842518 0.33658945
0.61990095 0.54372307 0.49982101 0.23555037 0.39283379 0.48492084
0.58644824 0.64524906 0.31279271 0.39476181 0.58644824 0.39028705
0.43856802 0.32296735 0.5541861 ]]
那么,我如何只对非零值取平均值呢
我的另一个问题是如何删除所有等于某个值的值,正如我在上面指出的,我可能必须将某个值变为零?但是我该怎么做呢?例如,我想去掉所有等于1.0或更大的值?
这是我到目前为止制作矩阵的代码:
vectorized_words = parse.csr_matrix(vectorize_words(nostopwords,glove_dict))
#calculating the distance/similarity between each vector in the matrix
cos_similiarity = cosine_similarity(vectorized_words, dense_output=False)
# since there are duplicates like (5,0) and (0,5) which we should remove, I use scipy's triu function
coo_cossim = cos_similiarity.tocoo()
vector_similarities = sparse.triu(coo_cossim, k = 1).tocsr()
是的,csr_matrix.mean在计算平均值时包含所有零。举个简单的例子:
from scipy.sparse import csr_matrix
m = csr_matrix(([1,1], ([2,3],[3,3])), shape=(5,5))
m.toarray()
# returns:
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0]], dtype=int32)
# test the mean method
m.mean(), m.mean(axis=0), m.mean(axis=1)
# returns:
0.080000000000000002,
matrix([[ 0. , 0. , 0. , 0.4, 0. ]]),
matrix([[ 0. ],
[ 0. ],
[ 0.2],
[ 0.2],
[ 0. ]])
如果需要执行不包含零的计算,则必须使用其他方法生成结果。但这并不难做到:
nonzero_mean = m.sum() / m.count_nonzero()
是的,csr_matrix.mean在计算平均值时包含所有零。举个简单的例子:
from scipy.sparse import csr_matrix
m = csr_matrix(([1,1], ([2,3],[3,3])), shape=(5,5))
m.toarray()
# returns:
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0]], dtype=int32)
# test the mean method
m.mean(), m.mean(axis=0), m.mean(axis=1)
# returns:
0.080000000000000002,
matrix([[ 0. , 0. , 0. , 0.4, 0. ]]),
matrix([[ 0. ],
[ 0. ],
[ 0.2],
[ 0.2],
[ 0. ]])
如果需要执行不包含零的计算,则必须使用其他方法生成结果。但这并不难做到:
nonzero_mean = m.sum() / m.count_nonzero()
你是在使用scipy.sparse的csr_矩阵吗?@James是的,我想这不太可能意味着忽略了零。为什么不直接做sumarr,axis=…/苏马尔!=0,axis=…?@Eric它会工作并得到所有,因为就像我在问题中所展示的,我的矩阵实际上更像一个向量列表,我需要每个向量的所有值吗?我应该把什么作为轴的参数,我不太熟悉如何使用轴?我需要每个向量的所有值-这就是轴参数的目的,如果我理解正确的话。你是在使用scipy.sparse的csr_矩阵吗?@James yes我想这不太可能意味着忽略了零。为什么不直接做sumarr,axis=…/苏马尔!=0,axis=…?@Eric它会工作并得到所有,因为就像我在问题中所展示的,我的矩阵实际上更像一个向量列表,我需要每个向量的所有值吗?我应该把什么作为axis的参数,我不太熟悉axis的用法?我需要每个向量的所有值-这就是axis参数的作用,如果我理解正确的话。如果你不调用它的任何方法,就不需要导入numpy,是吗?谢谢,这是一个复制/粘贴错误。现在已修复。谢谢。这实际上解决了我的两个问题。无论如何,我将通过它循环。如果你不调用它的任何方法,则无需导入numpy,是吗?谢谢,这是一个复制/粘贴条。现在修好了。谢谢你,这实际上解决了我的两个问题,不管怎样,我会循环使用它