如何计算 numpy array/matrix 的稀疏度百分比?
How to calculate percentage of sparsity for a numpy array/matrix?
我有以下 10 x 5 numpy array/matrix,它有许多 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.]])
如何准确测量这个数组的稀疏程度? numpy 中是否有一个简单的函数来测量缺失值的百分比?
np.isnan(a).sum()
给出 nan
值的数量,在本例中为 8。
np.prod(a.shape)
是值的个数,这里是50。它们的比例应该是想要的值。
In [1081]: np.isnan(a).sum()/np.prod(a.shape)
Out[1081]: 0.16
您可能还会发现从中创建一个屏蔽数组很有用
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]]
那么有效值的个数是:
In [1089]: a_ma.compressed().shape
Out[1089]: (42,)
测量缺失值的百分比已由'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%...
定义:
一般情况代码:
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)
结果:
0.555555555556
我有以下 10 x 5 numpy array/matrix,它有许多 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.]])
如何准确测量这个数组的稀疏程度? numpy 中是否有一个简单的函数来测量缺失值的百分比?
np.isnan(a).sum()
给出 nan
值的数量,在本例中为 8。
np.prod(a.shape)
是值的个数,这里是50。它们的比例应该是想要的值。
In [1081]: np.isnan(a).sum()/np.prod(a.shape)
Out[1081]: 0.16
您可能还会发现从中创建一个屏蔽数组很有用
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]]
那么有效值的个数是:
In [1089]: a_ma.compressed().shape
Out[1089]: (42,)
测量缺失值的百分比已由'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%...
定义:
一般情况代码:
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)
结果:
0.555555555556