在深度学习经常会碰到一段代码,即对数据进行向量化,也就是将整数序列编码为二进制矩阵。具体也就是下面的代码,比较难理解的是results[i, sequence] = 1.
,这段代码怎么就把就把数组该行上的某些列给赋值成1.0了?
代码语言:javascript复制import numpy as np
def vectorize_sequences(sequences, dimension=10000):
results = np.zeros((len(sequences), dimension))
for i, sequence in enumerate(sequences):
results[i, sequence] = 1.
return results
x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)
实验的过程如下,未必能完全理解,但至少知道上面的代码是如何发挥作用的。
1、先构造一个(2,10)的0值numpy矩阵
2、构造两个list对象,注意list中最大值要小于numpy的列。
3、把这两个list对象组合成numpy矩阵,这个矩阵是一维的
4、按照上面的方法进行赋值,观察其输出,发现指定位置上的值已更新为1
5、再单独构造一个list,对矩阵相关位置直接赋值,再观察其输出。
代码语言:javascript复制import numpy as np
s=(2, 10)
results = np.zeros(s)
#results =
#[[0. 0. 0. 0. 0.]
# [0. 0. 0. 0. 0.]]
a=list([1,2,3])
b=list([2,3,4,5])
sequences=np.array([a,b])
#sequences=[list([1, 2, 3]) list([2, 3, 4, 5])]
for i, sequence in enumerate(sequences):
print('i,sequence=',i,sequence)
#i, sequence = 0[1, 2, 3] #sequences第一行
#i, sequence = 1[2, 3, 4, 5] #sequences第二行
results[i, sequence] = 1.
#[0. 1. 1. 1. 0. 0. 0. 0. 0. 0.] #results第一行
#[0. 0. 1. 1. 1. 1. 0. 0. 0. 0.] #results第二行
#results =
#[[0. 1. 1. 1. 0. 0. 0. 0. 0. 0.]
# [0. 0. 1. 1. 1. 1. 0. 0. 0. 0.]]
rep=list([6,7,8])
results[0,rep]=1.0
#results =
#[[0. 1. 1. 1. 0. 0. 1. 1. 1. 0.]
# [0. 0. 1. 1. 1. 1. 0. 0. 0. 0.]]
写在最后的话,突然想明白了,如同excel中对单行多列进行赋值是一个道理。无论如何,实践是硬道理,虽然自己傻了点,思考小半天的问题,居然一瞬间想明白了。