Python 计算Numpy中每个类的非零项

Python 计算Numpy中每个类的非零项,python,numpy,Python,Numpy,我正在阅读《Python机器学习入门》一书中的NaiveBayes分类器示例,并努力理解以下代码示例的机制: import numpy as np X = np.array([[0,1,0,1], [1,0,1,1], [0,0,0,1], [1,0,1,0]]) y = np.array([0,1,0,1]) print(X) print('\n') print(y) print('\n') count

我正在阅读《Python机器学习入门》一书中的NaiveBayes分类器示例,并努力理解以下代码示例的机制:

import numpy as np

X = np.array([[0,1,0,1],
              [1,0,1,1],
              [0,0,0,1],
              [1,0,1,0]])

y = np.array([0,1,0,1])

print(X)
print('\n')
print(y)
print('\n')

counts = {}

for label in np.unique(y):
    print(label,'\n')
    counts[label] = X[y == label].sum(axis=0)
    print(counts[label],'\n')

print('Feature counts:\n{}'.format(counts))
代码的输出

[[0 1 0 1]
 [1 0 1 1]
 [0 0 0 1]
 [1 0 1 0]]


[0 1 0 1]


0 

[0 1 0 2] 

1 

[2 0 2 1] 

Feature counts:
{0: array([0, 1, 0, 2]), 1: array([2, 0, 2, 1])}
我不明白每个类(0和1)的数组是如何填充的

我的理解是sum(axis=0)意味着对矩阵的一列求和。因此,对于“0”标签(又名类),我在矩阵“X”中计算以下内容:

第一列2个零,第二列3个零,第三列2个零,第四列1个零


鉴于代码输出,我的理解显然不正确。

您可以从代码行的内部开始

X[y == label].sum(axis=0)
让我们看一下案例
label==0
。然后

y == label
# results in
[ True False  True False]
使用带有4个条目的布尔列表索引
X
,将从X中选择第一行和第三行

[[0 1 0 1] # True [1 0 1 1] # False [0 0 0 1] # True [1 0 1 0]] # False 现在沿着这个2x4数组的列方向求和

X[y == label].sum(axis=0)
# results in
[0 1 0 2]
我在这里猜测,但您可能想做的是创建一个包含
X
本身的布尔数组,并在其列上求和

counts[label] = (X == label).sum(axis=0)
使用这一行运行代码将产生

# for label == 0
[2 3 2 1] 
# for label == 1
[2 1 2 3] 

您似乎忘记了布尔掩码
y==label

关于国家的文件:

与整数索引数组不同,在布尔型数组中,结果是一个一维数组,包含索引数组中的所有元素,对应于布尔型数组中的所有真元素

因此,
X[y==label]
对于
label=0
的结果是:

X[np.array(true, false, true, false)]
根据文件,这是:

[[0 1 0 1]
 [0 0 0 1]]
垂直求和得到:

count[0] = np.array([0, 1, 0, 2])
相同的进程将获得计数[1]。这次
label=1
y==label
给出
np.array(false,true,false,true)
。使用此数组屏蔽
X
,可提供:

[[1 0 1 1]
 [1 0 1 0]]
垂直求和以获得:

count[1] = np.array([2, 0, 2, 1])
count[1] = np.array([2, 0, 2, 1])