Numpy中矩阵与向量的表示语法为何看似不符合直觉?
Numpy矩阵与向量乘法的维度逻辑说明
你没遗漏知识点,只是Numpy的维度设计和线性代数里的“直观书写习惯”存在差异,核心要搞清楚数组维度和线性代数中向量/矩阵的定义这两点的区别:
关于向量的写法
- 你觉得更直观的
np.array([5,6])是Numpy中的一维数组,它的shape是(2,),没有明确的行/列属性。而例子里的np.array([[5],[6]])是二维数组,shape是(2,1),对应线性代数里的列向量。 - Numpy的
np.dot函数对不同维度的数组处理逻辑不同:- 用shape为
(2,2)的矩阵w乘一维数组v = np.array([5,6])时,dot(w, v)会自动把一维数组当作行向量的转置来计算,结果是一维数组array([23, 34]),数值和你要的列向量结果完全一致,只是维度不同。 - 如果你需要严格对应线性代数中列向量乘法的输出格式(二维列向量),可以把一维数组转成二维:
v = np.array([5,6])[:, np.newaxis],这样写法更简洁,也符合你的直觉。
- 用shape为
关于矩阵的写法
- Numpy默认采用行优先存储,也就是你输入的子数组会被当作矩阵的一行。例子里的
np.array([[1,3],[2,4]])对应的线性代数矩阵就是:
你提到的“第一基向量[[1 3] [2 4]][1,2]”其实是这个矩阵的第一列,而线性代数中确实会把矩阵的列当作基向量,但这和Numpy的行优先存储逻辑不冲突,只是书写顺序的问题。 - 如果你想按照“基向量为列”的方式书写,可以通过转置来调整:
或者用# 按列的基向量书写,转置后得到目标矩阵 w = np.array([[1,2],[3,4]]).T print(w) # 输出: # [[1 3] # [2 4]]np.column_stack直接按列组合数组,更符合你的直觉:w = np.column_stack([[1,2],[3,4]])
总结
Numpy的语法设计是为了兼顾数值计算的效率和通用性,行优先存储也是大多数编程语言的通用选择,并非不合理。你完全可以按照自己的线性代数直觉来书写代码,只要注意数组的维度和转置操作就行,比如更简洁的写法:
import numpy as np w = np.array([[1,2],[3,4]]).T v = np.array([5,6]) result = np.dot(w, v) # 输出一维结果 print(result) # [23 34] # 转成列向量格式的结果 print(result[:, np.newaxis]) # 输出: # [[23] # [34]]
内容的提问来源于stack exchange,提问作者smellerbee
相关产品推荐
相关产品推荐

