# 数组和向量关于冒号:的用法示例
def testArray():
    a = np.array([1, 2, 3, 4, 5])
    # 数组取值
    print(a[:])  # [1 2 3 4 5]
    print(a[2])  # 3
    b = a.reshape(1, 5)  # 转换成向量
    # 向量取值
    print(b[:, 2])  # [3]

在机器学习和深度学习的编程过程中,为了提高程序的运行速度,通常将模型表达式转换为向量表达式(向量化),即利用矩阵运算思想提高运行效率。那么,在Python中究竟如何利用Numpy库定义一个向量,以及如何判断否为向量呢?

(一)Python中向量的特征

通常情况下,Python中向量和数组之间界限比较模糊,很多时候是通用的,但是在有时候数组不一定能够表示向量,比如,利用Numpy中random模块中的randn函数生成的一维数组,既不是行向量,也不是列向量,而是秩为1的数组:

Python两个numpy向量对应位置相乘 pythonnumpy向量模_一维数组


上述秩为1的一维数组仅有一个方括号,而实际中向量或者矩阵有两层方括号(即属于二维数组),下面给出列向量、行向量和矩阵的示例。

列向量:

Python两个numpy向量对应位置相乘 pythonnumpy向量模_数组_02


行向量:

Python两个numpy向量对应位置相乘 pythonnumpy向量模_数组_03


矩阵:

Python两个numpy向量对应位置相乘 pythonnumpy向量模_Python_04

综上可知,可以以方括号的形式判断数组是否能够代表一个向量或者矩阵,又或者通过转置看前后是否变化来判断。
(二)Python中向量的构建
在实际编程中,可以采用如下方式构建向量或者矩阵,即

(1)reshape()函数

通过reshape()函数可以依据数组创建指定维度的向量或者矩阵,比如可以针对秩为1的数组创建列向量或者行向量或者矩阵,即由一维数组转化成二维数组,如下所示

Python两个numpy向量对应位置相乘 pythonnumpy向量模_一维数组_05


注:reshape()函数可以创建指定形状的新数组,但是不会改变原数组的形状,如

Python两个numpy向量对应位置相乘 pythonnumpy向量模_数组_06


(2)直接在构建数组时,利用数组函数指定行列数

可以利用zeros(),ones(),randn()等函数构建指定形状的数组、向量、矩阵,例如

Python两个numpy向量对应位置相乘 pythonnumpy向量模_Python_07


注:np.zeros(数值)构建的一维数组秩为1,不能代表向量,(同rand()函数)如

Python两个numpy向量对应位置相乘 pythonnumpy向量模_数组_08


注:empty()函数也可以构建数组,该函数创建一个指定形状和数据类型且未初始化的数组。

Python两个numpy向量对应位置相乘 pythonnumpy向量模_一维数组_09


(3)np.random.rand()函数+reshape()函数

Python两个numpy向量对应位置相乘 pythonnumpy向量模_Python_10


(4)np.arange()函数+reshape()函数

Python两个numpy向量对应位置相乘 pythonnumpy向量模_数组_11

为什么向量化比for循环快?
numpy运算是向量化的,进行的是CPU指令集层面的并行运算,for循环是串行运算,效率肯定差多了。
向量化的优势是运行快,劣势是费内存,矩正太大就放不进去了;
for循环的优势是不费内存,劣势是运行慢,适用于数据量不大时使用;