我正试图理解一个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数组:
[ 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 arrange是一个张量,范围从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()输入,我不明白其中的“1”位于何处。例如,以下是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]
有人能够解释一下我是如何从那个输入值得到那个输出数组的吗?看起来1在随机位置,而且在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))
Y.flatten()
选择第一维度的索引。np.arange(m)
选择第二维度的索引。- 使用每个数组的第一个元素 -Y_one_hot[8,0] = 1
。 - wwiinp.vstack((Y,np.arange(m))).T
将展示给您如何将索引配对。您可以看到第30个条目 (np.vstack((Y,np.arange(m))).T[29]
) 是[0,29]
。因此,您的表达式正在将一个值分配给Y_one_hot[0,29]
- 如果这仍然让您感到困惑,您需要花更多时间阅读Numpy文档并尝试使用示例进行操作 - SO不是教程。jakevdp的答案中链接的文档参考与您的问题相关。 - wwii