矩阵转换|python学习笔记(新手小白友好版)

python引入numpy模块后,可以定义矩阵形数组(已下简称“矩阵”),读取矩阵行列数,改变矩阵行列数,甚至改变矩阵中数据的类型。

【1】读取矩阵的维数:ndim

先使用array模块,分别定义一维和二维矩阵,再用ndim获取矩阵维数。

#引入numpy模块
import numpy as np
a=np.array([1,2,3]) #使用array定义一维数组
b=np.array([[1,2,3],[4,5,6]]) #使用array定义二维数组
c=np.array([[1,2,3],[4,5,6],[7,8,9]]) #使用array定义二维数组
d=a.ndim
e=b.ndim
f=c.ndim
print("矩阵a的维数是:",d) #输出矩阵a的维数
print("矩阵b的维数是:",e) #输出矩阵b的维数
print("矩阵c的维数是:",f) #输出矩阵c的维数

上述代码执行过程中,ndim模块准确获取了矩阵a、b和c的维数。

可以从字面意思进一步理解ndim,它是n-Dimention的缩写,也即理论上可以无限输出“维数”。

进一步输出矩阵a、b和c,输入以下代码:

print("矩阵a:",a) #输出矩阵a
print("矩阵b:",b) #输出矩阵b
print("矩阵c:",c) #输出矩阵c

输出结果为:

可见:ndim仅仅是读取了矩阵的维数,对矩阵本身不会做任何改变

ndim相关完整代码如下:

#引入numpy模块
import numpy as np
a=np.array([1,2,3]) #使用array定义一维数组
b=np.array([[1,2,3],[4,5,6]]) #使用array定义二维数组
c=np.array([[1,2,3],[4,5,6],[7,8,9]]) #使用array定义二维数组
d=a.ndim
e=b.ndim
f=c.ndim
print("矩阵a的维数是:",d) #输出矩阵a的维数
print("矩阵b的维数是:",e) #输出矩阵b的维数
print("矩阵c的维数是:",f) #输出矩阵c的维数
print("矩阵a:",a) #输出矩阵a
print("矩阵b:",b) #输出矩阵b
print("矩阵c:",c) #输出矩阵c

【2】读取矩阵的行列数:shape

大多时候,我们直接跨过矩阵的维数,重点关注矩阵的行列数。

使用shape模块,可以获取矩阵的行列数。

先尝试使用shape获取矩阵的行列数:

#引入numpy模块
import numpy as np
a=np.array([1,2,3]) #使用array定义一维数组
b=np.array([[1,2,3],[4,5,6]]) #使用array定义二维数组
c=np.array([[1,2,3],[4,5,6],[7,8,9]]) #使用array定义二维数组
d=a.shape
e=b.shape
f=c.shape
print("矩阵a的行列数是:",d) #输出矩阵a的行列数
print("矩阵b的行列数是:",e) #输出矩阵b的行列数
print("矩阵c的行列数是:",f) #输出矩阵c的行列数
print("矩阵a:",a) #输出矩阵a
print("矩阵b:",b) #输出矩阵b
print("矩阵c:",c) #输出矩阵c

输出结果为:

可见:

【a】shape对一维array矩阵的行列数读取结果并不完整,输出结果是(3,),出现了未知数;

【b】shape对矩阵本身不会做任何改变

前述文章已经初步发现:array和matrix定义的矩阵形数组至少在乘法计算上有所不同,因此此处增加matrix定义矩阵行列数的读取测试,先输入以下代码:

a1=np.matrix([1,2,3]) #使用matrix定义一维数组
b1=np.matrix([[1,2,3],[4,5,6]]) #使用matrix定义二维数组
c1=np.matrix([[1,2,3],[4,5,6],[7,8,9]]) #使用matrix定义二维数组
d1=a1.shape
e1=b1.shape
f1=c1.shape
print("矩阵a1的行列数是:",d1) #输出矩阵a1的行列数
print("矩阵b1的行列数是:",e1) #输出矩阵b1的行列数
print("矩阵c1的行列数是:",f1) #输出矩阵c1的行列数

输出结果为:

可见:

【a】shape仅仅是读取了matrix矩阵的行列数,对于一维矩阵a,1行3列,正常输出;

【b】shape对矩阵本身不会做任何改变

【c】对比发现,shape模块对于array矩阵,一维数组矩阵实际上输出了列数,多维数组矩阵则是按照一个“[ ]”代表一行输出结果;shape模块对于matrix矩阵,一维数组矩阵和多维数组矩阵都按照是一个“[ ]”代表一行输出结果。

shape相关完整代码如下:

#引入numpy模块
import numpy as np
a=np.array([1,2,3]) #使用array定义一维数组
b=np.array([[1,2,3],[4,5,6]]) #使用array定义二维数组
c=np.array([[1,2,3],[4,5,6],[7,8,9]]) #使用array定义二维数组
d=a.shape
e=b.shape
f=c.shape
print("矩阵a的行列数是:",d) #输出矩阵a的行列数
print("矩阵b的行列数是:",e) #输出矩阵b的行列数
print("矩阵c的行列数是:",f) #输出矩阵c的行列数
print("矩阵a:",a) #输出矩阵a
print("矩阵b:",b) #输出矩阵b
print("矩阵c:",c) #输出矩阵c
a1=np.matrix([1,2,3]) #使用matrix定义一维数组
b1=np.matrix([[1,2,3],[4,5,6]]) #使用matrix定义二维数组
c1=np.matrix([[1,2,3],[4,5,6],[7,8,9]]) #使用matrix定义二维数组
d1=a1.shape
e1=b1.shape
f1=c1.shape
print("矩阵a1的行列数是:",d1) #输出矩阵a1的行列数
print("矩阵b1的行列数是:",e1) #输出矩阵b1的行列数
print("矩阵c1的行列数是:",f1) #输出矩阵c1的行列数

【3】改变矩阵的行列数:shape

前述内容讨论了shape读取array和matrix矩阵的行列数,此处尝试强行修改矩阵的行列数。

在pycharm中输入以下代码:

#引入numpy模块
import numpy as np
a=np.array([[1,2,3],[4,5,6]]) #使用array定义一维数组
a1=a.shape #读取矩阵a的行列数
print('矩阵a的行列数是:',a1) #输出矩阵a
a.shape=(3,2) #修改矩阵a的行列数
print('行列数修改后的矩阵a=\n',a) #输出a,\n用于换行

输出结果为:

可见,矩阵a在shape模块的作用下成功实现了行列转换。

【4】改变矩阵的行列数:reshape

numpy还提供了一个直接修改矩阵行列数的reshape模块。

在pycharm中输入以下代码:

#引入numpy模块
import numpy as np
a=np.array([[1,2,3],[4,5,6]]) #使用array定义二维数组
a1=a.shape #读取矩阵a的行列数
print('矩阵a的行列数是:',a1)
b=a.reshape(3,2) #转换矩阵a的行列数
print('矩阵b=',b)
b1=b.shape #读取矩阵b的行列数
print('矩阵b的行列数是:',b1)
c=np.matrix('1,2,3;4,5,6') #使用matrix定义二维数组
c1=c.shape #读取矩阵c的行列数
print('矩阵c的行列数是:',c1)
d=c.reshape(3,2) #转换矩阵c的行列数
print('矩阵b=',b)
d1=d.shape #读取矩阵d的行列数
print('矩阵d的行列数是:',d1)

输出结果为:

如图所示,array和matrix定义矩阵在shape模块的作用下均成功实现了行列转换。

【5】array和matrix一维矩阵形数组属性分析

前述内容已经发现,读取行列数时,array和matrix一维矩阵形数组会出现不一样的结果,此处对此进行专项测试。

【5.1】ndim维数分析

输入以下代码:

#引入numpy模块
import numpy as np
a=np.array([1,2,3]) #使用array定义一维数组
b=np.matrix([1,2,3]) #使用matrix定义一维数组
print('array定义一维数组a=',a) #输出array定义一维数组
print('matrix定义一维数组b=',b) #输出matrix定义一维数组
c=a.ndim #获取矩阵a的维数
d=b.ndim #获取矩阵b的维数
print('array定义一维数组a的维数是:',c) #输出array定义一维数组的维数
print('matrix定义一维数组b的维数是:',d) #输出matrix定义一维数组的维数

输出结果为;

可见,array按照常规对数组的理解,维数输出结果为1,matrix按照矩阵对数组的规定,维数输出结果为2。

【5.2】shape行列数分析

输入以下代码:

#引入numpy模块
import numpy as np
a=np.array([1,2,3]) #使用array定义一维数组
b=np.matrix([1,2,3]) #使用matrix定义一维数组
print('array定义一维数组a=',a) #输出array定义一维数组
print('matrix定义一维数组b=',b) #输出matrix定义一维数组
c=a.shape #获取矩阵a的行列数
d=b.shape #获取矩阵b的行列数
print('array定义一维数组a的行列数是:',c) #输出array定义一维数组的行列数
print('matrix定义一维数组b的行列数是:',d) #输出matrix定义一维数组的行列数
a.shape=(3,1) #转换矩阵a的行列数
b.shape=(3,1) #转换矩阵b的行列数
print('行列数修改后的矩阵\na=\n',a) #输出a,/n用于换行
print('行列数修改后的矩阵\nb=\n',b) #输出b,/n用于换行

输出结果为:

该结果表明,行列数更改操作的结果,array一维矩阵形数组和matrix一维矩阵形数组完全一致

因此,

array定义一维数组a的行列数是: (3,)

这个输出结果没有报错,但是肯定存在问题。

【5.3】array一维矩阵形数组定义

基于5.2节分析,尝试修改array以为矩阵形数组定义方式。

基本思路:既往实例已经证明,n行m列的array和matrix数组输出结果一致。因此,追溯一维矩阵形数组和n行m列数组定义方式不同,可能有助于解决该问题。

步骤:

【a】尝试对比n行m列的array和matrix数组定义和输出结果;

【b】比对修改单行即一维矩阵形array和matrix数组定义代码。

在pycharm输入以下代码:

import numpy as np #引入numpy模块
a=np.array([[1,2,3],[4,5,6]]) #使用array定义二维数组
b=np.matrix('1,2,3;4,5,6') #使用matrix定义二维数组
print('array定义一维数组\na=\n',a)
print('array定义一维数组\nb=\n',b)

输出结果一致:

综合上图,array和matrix计算结果一致。

结合文章到此所述所有程序,会发现一个共同点:矩阵是以方框“[ ]”为标志进行定义的,所有2x3的矩阵形数组都是“[ [ ], [ ] ]”的形式,可统称为一个大方框[ ]内嵌两个小[ ] 。

至此,步骤[a]执行完毕,开启执行步骤[b]。

据上述发现,考虑将一维矩阵形数组写作[ [ ] ],即两个方框嵌套的形式:

import numpy as np #引入numpy模块
a=np.array([[1,2,3],[4,5,6]]) #使用array定义二维数组
b=np.matrix('1,2,3;4,5,6') #使用matrix定义二维数组
print('array定义二维数组\na=\n',a)
print('array定义二维数组\nb=\n',b)
c=np.array([1,2,3]) #使用array定义一维数组
d=np.array([[1,2,3]]) #使用array定义一维数组
e=c.shape
f=d.shape
print('array模块使用单个方框[ ]定义一维矩阵形数组的行列数是:',e)
print('array模块使用嵌套方框[ ]定义一维矩阵形数组的行列数是:',f)
g=np.matrix('1,2,3') #使用matrix定义一维数组
h=g.shape
print('matrix模块定义一维矩阵形数组的行列数是:',h)

输出结果如图:

可见,array模块使用两个方框嵌套的形式定义一维矩阵形数组时,shape模块读取的矩阵行列数与matrix模块定义矩阵行列数相等。

因此,在使用array模块定义一维矩阵形数组时,如有需要,应用两层[ ]彼此嵌套,完成定义。

【6】结语

本次内容先后学习了:

【a】使用ndim模块读取矩阵维数;

【b】使用shape模块读取矩阵行列数;

【c】使用shape模块修改矩阵行列数;

【d】使用reshape模块修改矩阵行列数;

【e】发现使用两层方框嵌套,即写成“[  [ ] ]”的形式可使array定义的一维矩阵形数组行列数,和用matrxi定义的一维矩阵形数数组,使用shape模块读取的行列数一致。

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值