gpt4 book ai didi

python - 来自 numpy 的一种热编码

转载 作者:行者123 更新时间:2023-12-03 21:44:06 27 4
gpt4 key购买 nike

我正在尝试理解示例 python tutorial 的输出值.输出似乎没有我能理解的任何顺序。特定的 python 行给我带来了麻烦:

vocab_size = 13   #just to provide all variable values
m = 84 #just to provide all variable values
Y_one_hot = np.zeros((vocab_size, m))
Y_one_hot[Y.flatten(), np.arange(m)] = 1
输入 Y.flatten() 被评估为以下 numpy-array :
  [ 8  9  7  4  9  7  8  4  8  7  8 12  4  8  9  8 12  7  8  9  7 12  7  2
9 7 8 7 2 0 7 8 12 2 0 8 8 12 7 0 8 6 12 7 2 8 6 5
7 2 0 6 5 10 2 0 8 5 10 1 0 8 6 10 1 3 8 6 5 1 3 11
6 5 10 3 11 5 10 1 11 10 1 3]
np排列是一个范围从0-83的张量
np.arange(m)
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
72 73 74 75 76 77 78 79 80 81 82 83]
好的,所以我从新的 Y_one_hot 中无法理解的输出是我收到一个大小为 13 的 numpy 数组(如预期),但我不明白为什么这些位置的位置基于 Y。 flatten() 输入例如这里是 13 的第一个数组:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0]
有人可以解释一下我是如何从那一行的输入值到输出数组的吗?似乎这些位置是随机的,并且在 13 个的其他一些数组中,1 的数量似乎也是随机的。这是预期的行为吗?
这是一个完整的可运行示例:
import numpy as np
import sys
import re



# turn Y into one hot encoding
Y = np.array([ 8, 9, 7, 4 , 9, 7, 8, 4, 8, 7, 8, 12, 4, 8, 9, 8, 12, 7, 8, 9, 7, 12, 7, 2,
9, 7, 8, 7, 2, 0, 7, 8, 12, 2, 0, 8, 8, 12, 7, 0, 8, 6, 12, 7, 2, 8, 6, 5,
7, 2, 0, 6, 5, 10, 2, 0, 8, 5, 10, 1, 0, 8, 6, 10, 1, 3, 8, 6, 5, 1, 3, 11,
6, 5, 10, 3, 11, 5, 10, 1, 11, 10, 1, 3])
m = 84
vocab_size = 13
Y_one_hot = np.zeros((vocab_size, m))
Y_one_hot[Y.flatten(), np.arange(m)] = 1
np.set_printoptions(threshold=sys.maxsize)
print(Y_one_hot.astype(int))

最佳答案

您展示的代码是将多个标签索引转换为单热编码的快速方法。
让我们用单个索引来做,并将其转换为单热编码向量。为简单起见,我们将坚持使用 10 的编码大小(即九个 0 和一个 0 ):

>>> y = 4
>>> y_ohe = np.zeros(10)
>>> y_ohe[y] = 1
array([0., 0., 0., 0., 1., 0., 0., 0., 0., 0.])
现在,让我们尝试使用多个索引:同时使用 5 个标签。起始数组将是二维的: (5, 10) ,即每个标签大小为 10 的单热编码向量。
>>> y = np.array([4, 2, 1, 7])
>>> y_ohe = np.zeros((4, 10))
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
想要的结果是:
array([[0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 7., 0., 0.]])
为此,我们将按行和列索引: np.arange(len(y))将为我们提供所有行索引,而 y将为我们提供 1 所在的列应该是。自 np.arange(len(y))y具有相同的长度,它们将被迭代压缩,就像
>>> for i, j in zip(np.arange(len(y)), y):
>>> print(i, j)
[0, 4]
[1, 2]
[2, 1]
[3, 7]
这些是 [i, j]二维张量中的坐标 y_ohe我们想要的地方 1是。
将索引值分配给 1 s:
>>> y_ohe[np.arange(len(y)), y] = 1
array([[0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 1., 0., 0.]])
同样,通过反向索引:
>>> y = np.array([4, 2, 1, 7])
>>> y_ohe = np.zeros((10, 4))
>>> y_ohe[y, np.arange(len(y))] = 1
array([[0., 0., 0., 0.],
[0., 0., 1., 0.],
[0., 1., 0., 0.],
[0., 0., 0., 0.],
[1., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 1.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])

在你的情况下 Y有一个额外的维度,比如 Y = np.array([[4], [2], [1], [7]])与我上面给出的例子有关。这会给 y压扁后。

关于python - 来自 numpy 的一种热编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65643248/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com