不明白这个示例 one-hot 代码如何在 j 是元组时使用 [i,j] 索引 numpy 数组?

Don't understand how this example one-hot code indexes a numpy array with [i,j] when j is a tuple?

我不明白行:results[i, sequence] = 1 在下面是如何工作的。

我在调试器中使用 Manning 书中的一些示例代码:"Deep Learning with Python"(书中的示例 3.5-classifying-movie-reviews.ipynb),虽然我理解代码的内容确实,我不明白语法或它是如何工作的。我正在尝试一起学习 Python 和深度学习,想了解代码的作用。

def vectorize_sequences(sequences, dimension=10000):
    # Create an all-zero matrix of shape (len(sequences), dimension)
    results = np.zeros((len(sequences), dimension))
    for i, sequence in enumerate(sequences):
        results[i, sequence] = 1.  # <--- How does this work?
    return results

所以我要做一些假设,因为你没有提供序列或维度的例子。我假设维度是 sequences 中的最高可能值 + 1,并且 sequences 中的每个值要么是整数,要么是整数的 tuple

这遍历每个序列,并将 i'th 行中的所有值设置为 1.0,其中索引位于 sequence.

# Create an all-zero matrix of shape (len(sequences), dimension)
results = np.zeros((len(sequences), dimension))
for i, sequence in enumerate(sequences):
    results[i, sequence] = 1.  # How does this work?
return results

所以用这些输入遍历它:

import numpy as np
sequences = [(2, 3), (2, 1), 4]
dimension = 5 # max value is 4, +1 is 5
results = np.zeros((len(sequences), dimension))
print(results)
#[[0. 0. 0. 0. 0.]
# [0. 0. 0. 0. 0.]
# [0. 0. 0. 0. 0.]]
for i, sequence in enumerate(sequences):
     results[i, sequence] = 1.0
print(results)
#[[0. 0. 1. 1. 0.]
# [0. 1. 1. 0. 0.]
# [0. 0. 0. 0. 1.]]

对于第一个序列 (2, 3),它将数组中的第 3 和第 4 项替换为 1.0

对于第二个序列(1, 2),它将数组中的第二和第三项替换为1.0

对于最后一个序列 4 将第 5 项替换为 1.0

假设sequence是一个整数列表,

results[i,sequence] = 1

等同于

for j in sequence:
    results[i][j] = 1

我之前遇到过同样的问题,后来我发现是因为results是一个numpy数组而不是一个列表。所以在一个 numpy 数组中,你可以通过 results[i,sequence] = 1 更新它,其中 sequence 是一个索引列表。但是在列表中你不能这样做。