不明白这个示例 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
- 这将创建
results
,一个 25,000 x 10,000 的零数组。
sequences
是一个元组列表,例如 (3, 0, 5)。然后它遍历 sequences
并且对于每个序列的每个非零值,将 results[i]
中的相应索引设置为 1.0。他们称之为单热编码。
- 我不明白怎么行:
results[i, sequence] = 1
在 numpy 中完成此操作。
- 我得到了
for i, sequence in enumerate(sequences)
部分:只是枚举 sequences
列表并跟踪 i
。
- 我猜有一些 numpy 魔法以某种方式在
results[i]
中设置值基于逐个元素检查 sequence[n]
并在 sequence[n]
非零时插入 1.0 (?) 只是想了解语法。
所以我要做一些假设,因为你没有提供序列或维度的例子。我假设维度是 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
是一个索引列表。但是在列表中你不能这样做。
我不明白行: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
- 这将创建
results
,一个 25,000 x 10,000 的零数组。 sequences
是一个元组列表,例如 (3, 0, 5)。然后它遍历sequences
并且对于每个序列的每个非零值,将results[i]
中的相应索引设置为 1.0。他们称之为单热编码。- 我不明白怎么行:
results[i, sequence] = 1
在 numpy 中完成此操作。 - 我得到了
for i, sequence in enumerate(sequences)
部分:只是枚举sequences
列表并跟踪i
。 - 我猜有一些 numpy 魔法以某种方式在
results[i]
中设置值基于逐个元素检查sequence[n]
并在sequence[n]
非零时插入 1.0 (?) 只是想了解语法。
所以我要做一些假设,因为你没有提供序列或维度的例子。我假设维度是 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
是一个索引列表。但是在列表中你不能这样做。