我试图理解示例python教程输出的值。输出似乎按照我能理解的任何顺序排列。特定的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个数组中,这些位置的数量似乎也是随机的。这是预期的行为吗?
这是一个完整的可运行示例:
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))
该行Y_one_hot[Y.flatten(), np.arange(m)] = 1
是带有整数索引列表的数组的设置值(在Integer Array Indexing中记录)
索引数组一起广播,一维数组的结果本质上是一种有效的方法:
for i, j in zip(Y.flatten(), np.arange(m)):
Y_one_hot[i, j] = 1
换句话说,的每一列Y_one_hot
对应于的条目Y.flatten()
,并且在该条目给定的行中具有单个非零值。
使用较小的数组可能更容易看到:
Y_onehot = np.zeros((2, 3), dtype=int)
Y = np.array([0, 1, 0])
Y_onehot[Y.flatten(), np.arange(3)] = 1
print(Y_onehot)
# [[1 0 1]
# [0 1 0]]
三个条目映射到三列,并且每一列在对应于该值的行中都有一个非零条目。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句