在Numpy中计算每个类的非零条目

问题描述 投票:1回答:2

我正在使用“使用Python进行机器学习简介”一书中的Naive Bayes分类器示例,并且正在努力理解以下代码示例的机制:

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个零

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

python numpy
2个回答
0
投票

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

有关Boolean or “mask” index arrays的文档说明:

与整数索引数组的情况不同,在布尔情况下,结果是一个一维数组,其中包含索引数组中与布尔数组中所有真实元素对应的所有元素。

因此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])

同样的过程得到count[1]。这次label = 1y == labelnp.array(false, true, false, true)。用这个数组掩盖X给出:

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

垂直求和得到:

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

2
投票

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

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
X[y == label]
#results in
[[0 1 0 1]
 [0 0 0 1]]

现在,您沿着此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] 
© www.soinside.com 2019 - 2024. All rights reserved.