python numpy程序语言提供了很高的灵活性,但同时也会产生一些问题。
例如在python中创建代码a=np.random.randn(5)
,这段代码生成5个随机高斯变量,存储在数组a中。这个数组的形状是(5,)结构,这是所谓的python秩为1的数组,它既不是行向量也不是列向量。
这种结构的转置和其本身是一样的,将这个结构的本身和其转置相乘得到的是一个数,而不是一个矩阵。当你编写神经网络的时候,不要用这种数据结构,这种数据结构形状是(5,)或者(n,),其中秩为1的数组。
可以将上述数据结构转换为矩阵,例如将初始化代码a=np.random.randn(5)
改写为a=np.random.randn(5,1)
,这样可以将a变成一个
5
∗
1
5*1
5∗1的列向量,之前a和a的转置看起来是一样的,但在新的代码中,a的转置使得a从一个列向量变为一个行向量。
代码a=np.random.randn(5)
创建了一个秩为1的数组,该数据结构的a.shape为(5,)。
在进行编程练习时或者实现神经网络的逻辑回归时,不用这些秩为1的数组。相反,每次创建数组时,把它定义成列向量,或者定义为一个行向量,代码表示为a=np.random.randn(5,1)
或者为a=np.random.randn(1,5)
。
在编程中不知道一个向量具体的维度是多少时,可以用声明assert()
来确保这是一个向量,例如assert(a.shape==(5,1))
,这是一个行向量。这些assert()执行起来很快,它们也可以看成是代码的文档。
如果由于某些原因得到一个秩为1的数组,可以使用reshape将秩为1的数组转换成一个矩阵,变成一个行向量或者列向量。