如何计算Numpy数组/矩阵的稀疏度百分比?

Sha*_*ang 5 python arrays numpy matrix sparse-matrix

我有以下10 x 5 numpy数组/矩阵,其中包含多个NaN值:

array([[  0.,   0.,   0.,   0.,   1.],
       [  1.,   1.,   0.,  nan,  nan],
       [  0.,  nan,   1.,  nan,  nan],
       [  1.,   1.,   1.,   1.,   0.],
       [  0.,   0.,   0.,   1.,   0.],
       [  0.,   0.,   0.,   0.,  nan],
       [ nan,  nan,   1.,   1.,   1.],
       [  0.,   1.,   0.,   1.,   0.],
       [  1.,   0.,   1.,   0.,   0.],
       [  0.,   1.,   0.,   0.,   0.]])
Run Code Online (Sandbox Code Playgroud)

如何精确测量此数组的稀疏程度?numpy中是否有一个简单的函数来测量缺失值的百分比?

mak*_*kis 14

定义:

在此处输入图片说明

一般情况的代码:

from numpy import array
from numpy import count_nonzero
import numpy as np

# create dense matrix
A = array([[1, 1, 0, 1, 0, 0], [1, 0, 2, 0, 0, 1], [99, 0, 0, 2, 0, 0]])

#If you have Nan
A = np.nan_to_num(A,0)

print(A)
#[[ 1  1  0  1  0  0]
# [ 1  0  2  0  0  1]
# [99  0  0  2  0  0]]

# calculate sparsity
sparsity = 1.0 - ( count_nonzero(A) / float(A.size) )
print(sparsity)
Run Code Online (Sandbox Code Playgroud)

结果:

0.555555555556
Run Code Online (Sandbox Code Playgroud)


hpa*_*ulj 5

np.isnan(a).sum()
Run Code Online (Sandbox Code Playgroud)

给出nan值的数量,在本例中为 8。

np.prod(a.shape)
Run Code Online (Sandbox Code Playgroud)

是值的数量,这里是 50。它们的比率应该给出所需的值。

In [1081]: np.isnan(a).sum()/np.prod(a.shape)
Out[1081]: 0.16
Run Code Online (Sandbox Code Playgroud)

您可能还会发现从这里制作一个掩码数组很有用

In [1085]: a_ma=np.ma.masked_invalid(a)
In [1086]: print(a_ma)
[[0.0 0.0 0.0 0.0 1.0]
 [1.0 1.0 0.0 -- --]
 [0.0 -- 1.0 -- --]
 [1.0 1.0 1.0 1.0 0.0]
 [0.0 0.0 0.0 1.0 0.0]
 [0.0 0.0 0.0 0.0 --]
 [-- -- 1.0 1.0 1.0]
 [0.0 1.0 0.0 1.0 0.0]
 [1.0 0.0 1.0 0.0 0.0]
 [0.0 1.0 0.0 0.0 0.0]]
Run Code Online (Sandbox Code Playgroud)

有效值的数量是:

In [1089]: a_ma.compressed().shape
Out[1089]: (42,)
Run Code Online (Sandbox Code Playgroud)


Aru*_*tri 5

'hpaulj' 已经解释了测量缺失值的百分比。

我正在回答你问题的第一部分,假设数组有零和非零......

稀疏是指零值,密度是指数组中的非零值。假设您的数组是 X,获取非零值的计数:

non_zero = np.count_nonzero(X)

X 中的总值:

total_val = np.product(X.shape)

稀疏性将是 -

sparsity = (total_val - non_zero) / total_val

密度将是 -

density = non_zero / total_val

稀疏度和密度的总和必须等于 100%...