许久以来都有一个疑问,numpy中的一维向量究竟是行向量还是列向量呢?

今天得空,测试一下。

思路

思路很简单,利用点乘两个向量维度要对应的特性测试。

  • 1.创建一个4*2矩阵a和一个一维numpy向量b
  • 2.使a点乘b,如果a和b的点乘np.dot(a,b)不报错,就说明一维向量b为2*1的列向量。如果报错,说明b肯定不是列向量。
  • 3.如果2不报错,将b转置,再使a点乘b,如果a和b的点乘np.dot(a,b)还不报错,就说明一维向量b既可以当做列向量也可以当做行向量。

代码测试 

思路中的第1和第2步测试代码如下:

a = np.array([[1,1,1,1],[1,1,1,1]]).T #4*2矩阵
b = np.array([2,3]) #长度为2的一维向量
print(a)
print(b)
print(a.shape)
print(b.shape)
print(np.dot(a,b))

输出:

 

python numpy创建列向量 numpy创建一维向量_点乘

很好,我们现在已经确定,一维向量b可以作为列向量与矩阵a相乘。

接着测试思路中的第3步,将b也做一下转置,看看a和b的点乘会不会出现问题,代码如下:

a = np.array([[1,1,1,1],[1,1,1,1]]).T #4*2矩阵
b = np.array([2,3]).T #长度为2的一维向量
print(a)
print(b)
print(a.shape)
print(b.shape)
print(np.dot(a,b))

输出:

python numpy创建列向量 numpy创建一维向量_numpy_02

 amazing,它居然也可以进行点乘,这就说明:numpy中的一维向量既可以作为行向量,也可以作为列向量存在。

结论

为了验证我的思路是否准确,我查阅了网上其他很多人的说法,和我的理解综合一下,总结下来,可以得到如下结论:

  1. 一维数组的转置仍是自己本身,这点根据上述实验的一维向量b的shape就能看出来,b.T(转置后)维度不变。
  2. 对于numpy中的一维向量b,可以认为它既不是行向量也不是列向量,它只是一个长度为2的一维向量。但是根据我的实验,我认为你也可以把他理解为它既可以做行向量同时也能做列向量,具体是行向量还是列向量根据与他进行点乘的矩阵而定。
  3. 在上述实验中可以得到一维向量既可以做行向量也可以做列向量,那对于任意一个给定的一维向量,我们就无法确定他到底是行向量还是列向量,为了防止这种尴尬的境地,习惯上用二维矩阵而不是一维矩阵来表示行向量和列向量,因为二维必定能够确定他是行向量还是列向量。

对于3,见下例:

b = np.array([[2,3]]) #行向量
c = np.array([[2],[3]]) #列向量
print(b)
print(c)
print(b.shape)
print(c.shape)

输出: 

python numpy创建列向量 numpy创建一维向量_numpy_03

这就是本文全部内容了,对向量在计算机中的表示形式又多了一点理解,针不搓~     (✪ω✪)