前言:
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中不管几维,都"全部当成数组"即可!
网友评论