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

标签 python numpy

我正在研究《Python 机器学习简介》一书中的朴素贝叶斯分类器示例,并且正在努力理解以下代码示例的机制:

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 个条目的 bool 列表来索引 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 本身的 bool 数组,并对它的列求和。

counts[label] = (X == label).sum(axis=0)

使用此行运行代码将产生

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

关于python - 在 Numpy 中计算每个类的非零条目数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47956549/

相关文章:

python - 是否可以在 django 项目的根目录下提供静态 html 页面?

python - Genshi:嵌套 for 循环

python - 使用 Numpy 数组从结构返回数据

python - 黑体光谱的普朗克公式

python - NumPy 2D 数组普通切片与基于 bool 的切片

python - 通过名称(而不是值)将变量从 IPython 终端传递到 Python 脚本

python - 根据与点的距离过滤坐标

python - 将包含串行初始化的python脚本导入 flask 应用程序

python - numpy:通过广播摆脱 for 循环

python - Python 错误中的缩进