首先我们先以一张图看看张量、标量、向量和矩阵的整体区别。
先贴上结果:
最重要的:列表、一维数组、一维向量都默认是n行1列的列向量(列矩阵). A = [[1,3,4,5,6]]是二维数组,1行5列张量是泛化的概念,广义上包含矩阵、数组、向量,对应标量;狭义上如图所示,专指3维及以上维数的数组情况
数组,在Python中实质和张量等价。形如np.array([1,2,3,4])
矩阵,经常和数组概念混,在Python中可以简单认为二者等价。只有一点可以区别彼此:一维和二维时,矩阵 = 数组,二维以上时只能是数组。硬要区分,则形如np.matrix([]).但实际大家都用np.array([1,2,3,4])来表示张量,很少出现matrix这个字眼。np.matrix([])和np.array([])作为矩阵相关函数的输入没有区别
向量,类似的,在Python中没有向量这个专门的名字,认为就是一维矩阵或者列表对象。需要注意,不存在横向量,认为所有一维矩阵/列表都是列向量,n行1列。np.shape()测试可知
列表, 形如[1,2,3,4].
标量,不解释。
元组很少和张量混用。尽管一维元组,似乎也是一维张量,如下截图运算所示可以看出,列表对象b和元组对象f被看做一维数组/矩阵/列向量
详细解说1:
cupy和numpy在矩阵和数组的使用上没有区别,在认识/创建层面有一些区别。numpy中:任何创建函数,创建的都是数组(type数据类型:numpy.ndarray)!例如:np.array、np.arrange、np.zeros等等;只有经过np.mat()转换后的数组,才会变成矩阵(type数据类型:numpy.matrix)!
cupy中:数组和矩阵的概念基本混用,只有一点可以区别彼此:一维和二维时,矩阵 = 数组,二维以上时只能是数组。
在numpy和cupy中,”数组“和”矩阵“数据类型的区别如下:一维和二维时:数组 = 矩阵,不需要多余说明,各种线性代数的矩阵操作可以直接使用;
二维以上时:只能是数组!因为矩阵的定义就是其维度不能高于二维,即三维以上没有矩阵的概念,纯粹是数组概念里的高维。因此,对于三维及以上的数组,不能也没必要转为矩阵。
不论几维:线性代数对矩阵的操作(如矩阵乘法),不管对象数据类型是矩阵还是数组,结果都是一样的!!
(1)numpy中各种函数创建的”数据类型“的例子:
# 用numpy函数创建的数据类型,都是以"数组"开始的!
import numpy as np
a = [1, 2, 3] ; b = [4, 5, 6]
w1 = np.array([a,b])
w2 = np.arange(2,10,2)
w3 = np.zeros( (2,3) )
w4 = np.zeros( (2,3,4) )
print( type(w1), type(w2), type(w3) ) # 结果:numpy.ndarray
(2)numpy中把原始的”数组转成矩阵“的唯一方式:
# np.mat函数:把数组类型转为矩阵类型
import numpy as np
a = [1, 2, 3] ; b = [4, 5, 6]
w1 = np.mat( np.array([a,b]) )
w2 = np.mat( np.arange(2,10,2) )
w3 = np.mat( np.zeros( (2,3) ) )
print( type(w1), type(w2), type(w3) ) # 结果:numpy.matrix
(3)当原始”数组高于二维时“,无法转为矩阵:
# 三维及以上数组无法通过np.mat()函数转为矩阵:因为不存在3维(及以上)矩阵这个概念!
import numpy as np
a = [1, 2, 3] ; b = [4, 5, 6]
w4 = np.array( [[a,b,a], [a,b,a]] )
w5 = np.zeros( (2,3,4) )
# 结果:报如下错误:
ValueError: shape too large to be a matrix.
(4)”二维数组“可直接进行各种线性代数的矩阵操作(无需先转为矩阵):
# 二维数组直接进行矩阵相乘:
import numpy as np
a = [1, 2]; b = [3, 4]
# 直接用二维数组计算矩阵相乘:
w6 = np.array( [a,b] )
result1 = np.matmul(w6,w6)
# 先转为二维矩阵,再进行矩阵相乘:
w7 = np.mat(w6)
result2 = np.matmul(w7,w7)
# 结果数值都一样,只是数据类型不同:
result1
Out[3]:
array([[ 7, 10],
[15, 22]])
result2
Out[4]:
matrix([[ 7, 10],
[15, 22]])
(5)”三维及以上数组“,进行线性代数矩阵运算,结果和低维矩阵一样!
import numpy as np
a = [1, 2, 3] ; b = [4, 5, 6]; c = [7, 8, 9]
# 高维数组进行矩阵乘法:
w8 = np.array( [[a,b], [a,b], [a,b]] )
w9 = np.array( [[a,b,c], [a,b,c], [a,b,c]] )
result3 = np.matmul(w8,w9)
# 对应的低维矩阵的矩阵乘法:
w10 = np.mat( np.array( [a,b] ) )
w11 = np.mat( np.array( [a,b,c] ) )
result4 = np.matmul(w10,w11)
# 结果:
result3
Out[3]:
array([[[30, 36, 42],
[66, 81, 96]],
[[30, 36, 42],
[66, 81, 96]],
[[30, 36, 42],
[66, 81, 96]]])
result4
Out[4]:
matrix([[30, 36, 42],
[66, 81, 96]])
总结:numpy:任何创建函数得到的最初数据类型都是数组;一维和二维时,可以用专门的np.mat()函数把数组转为矩阵;但不管是几维,对数组或矩阵进行线性代数的矩阵运算时,得到的结果都是一致的!因此其实也”没必要把数组转矩阵(不管几维)“!不管几维,”全部当成数组“就可以。
cupy:同numpy中黑体所说,因此cupy直接去掉了:一维和二维数组还能用专门函数转为专门的矩阵。同样,cupy中不管几维,都”全部当成数组“即可!
详细解说2:
matrix是array的分支,matrix和array在很多时候都是通用的,你用哪一个都一样。但这时候,官方建议大家如果两个可以通用,那就选择array,因为array更灵活,速度更快,很多人把二维的array也翻译成矩阵。
但是matrix的优势就是相对简单的运算符号,比如两个矩阵相乘,就是用符号*,但是array相乘不能这么用,得用方法.dot() (不明白这句话,np.matmul()对应数组、矩阵都是适用的呀?)
array的优势就是不仅仅表示二维,还能表示3、4、5…维,而且在大部分Python程序里,array也是更常用的。