Python numpy的基本用法(一)

本文深入探讨了Python中Numpy库的矩阵与数组的基本用法,包括mat()与array()函数的区别,常见矩阵的创建,如零矩阵、单位矩阵、随机矩阵等,以及矩阵的运算,如矩阵相乘、点乘、逆变换、转置等。同时,文章还介绍了数组的基本操作,如索引、切片、变形、级联和切分,并详细解释了数组的属性查看方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

矩阵的基本用法

mat()函数将目标数据的类型转化为矩阵

mat()与array()的区别

Numpy函数库中存在两种不同的数据类型(矩阵matrix和数组array),都可以用于处理行列表示的数字元素,虽然他们看起来很相似,但是在这两个数据类型上执行相同的数学运算可能得到不同的结果,其中Numpy函数库中的matrix与MATLAB中matrices等价。
例如

import numpy as np
 
a = np.mat('1 2;3 4')
b = np.mat([[1,2],[3,4]])
print(a)
print(b)
print(type(a))
print(type(b))
c = np.array([[1,3],[4,5]])
print(c)
print(type(c))

结果:
在这里插入图片描述
首先,mat() 函数与array()函数生成矩阵所需的数据格式有区别,mat()函数中数据可以为字符串以分号(;)分割或者为列表形式以逗号(,)分割,而array()函数中数据只能为后者形式。
其次,两者的类型不同,用mat函数转换为矩阵后才能进行一些线性代数的操作。

mat()函数创建常见的矩阵

import numpy as np
#创建一个2*2的零矩阵
data1=np.mat(np.zeros((2,2)))
#创建一个2*2的全1矩阵
data2=np.mat(np.ones((2,2)),dtype=int)
#创建一个2*2的单位矩阵
data3=np.mat(np.eye(2,2))
#创建一个2*2的随机数矩阵
data4=np.mat(np.random.randn(2,2))
#生成一个对角矩阵
a=[1,2,3]
data5=np.mat(np.diag(a))
#numpy.full(shape,fill_value=num)自定义填充,可以是数字,也可以是字符
data6=np.full(shape=(2,2,2),fill_value=5) #第一个2表示,填充两个矩阵
print(data1,'\n\n',data2,'\n\n',data3,'\n\n',data4,'\n\n',data5,'\n\n',data6)

结果

[[0. 0.]
 [0. 0.]] 

 [[1 1]
 [1 1]] 

 [[1. 0.]
 [0. 1.]] 

 [[ 0.90988277  0.72030404]
 [ 1.24342433 -0.50141365]] 

 [[1 0 0]
 [0 2 0]
 [0 0 3]]
 
 [[[5 5]
  [5 5]]

 [[5 5]
  [5 5]]]

##常见的矩阵运算

矩阵相乘(*)

from numpy import  *
''' 1*2 的矩阵乘以2*1 的矩阵  得到1*1 的矩阵''' 
a1 = mat([1,2])
print(a1)
a2 = mat([[1],[2]])
print(a2)
a3 = a1*a2
print(a3)

[[1 2]]
[[1]
[2]]
[[5]]

矩阵点乘(multiply)

from numpy import  *
''' 矩阵点乘为对应矩阵元素相乘'''
 
a1 = mat([1,1])
print(a1)
a2 = mat([2,2])
print(a2)
a3 = multiply(a1,a2)
print(a3)
[[1 1]]
[[2 2]]
[[2 2]]

矩阵求逆变换(.I)


2
3
4
5
6
7
8
9
10
11
12
13
from numpy import *
''' 矩阵求逆变换:求矩阵matrix([[0.5,0],[0,0.5]])的逆矩阵'''
 
a1 = mat(eye(2,2)*0.5)
print(a1)
a2 = a1.I
print(a2)
[[0.5 0. ]
 [0.  0.5]]
[[2. 0.]
 [0. 2.]]

矩阵求转置(.T)

from numpy import *
'''矩阵的转置'''
 
a1 = mat([[1,1],[0,0]])
print(a1)
a2 = a1.T
print(a2)
[[1 1]
 [0 0]]
[[1 0]
 [1 0]]

求矩阵对应列行的最大值,最小值,和。

from numpy import *
'''计算每一列,行的和'''
 
a1 = mat([[1,1],[2,3],[4,5]])
print(a1)
#  列和,这里得到的是1*2的矩阵,求列和只需要将axis=1
a2=a1.sum(axis=0)
print(a2)
[[7 9]]
#  计算a1矩阵中所有元素的最大值,这里得到的结果是一个数值
maxa = a1.max()
print(maxa)   #5
#  计算第二列的最大值,这里得到的是一个1*1的矩阵
a2=max(a1[:,1])
print(a2)   #[[5]]
#  计算第二行的最大值,这里得到的是一个一个数值
maxt = a1[1,:].max()
print(maxt)   #3
#   计算所有列的最大值,这里使用的是numpy中的max函数
maxrow = np.max(a1,0)
print(maxrow)   #[[4 5]]
# ;//计算所有行的最大值,这里得到是一个矩阵
maxcolumn = np.max(a1,1)
print(maxcolumn)
#  计算所有列的最大值对应在该列中的索引
maxindex = np.argmax(a1,0)
print(maxindex)   #[[2 2]]
#  计算第二行中最大值对应在改行的索引
tmaxindex = np.argmax(a1[1,:])
print(tmaxindex)  # 1

矩阵的分隔和合并 (vstack hstack)

from numpy import *
 
a = mat(ones((2,2)))
print(a)
b = mat(eye(2))
print(b)
# 按照列和并,即增加行数
c = vstack((a,b))
print(c)
# 按照行合并,即行数不变,扩展列数
d = hstack((a,b))
print(d)
[[1. 1.]
 [1. 1.]]
  
[[1. 0.]
 [0. 1.]]
  
[[1. 1.]
 [1. 1.]
 [1. 0.]
 [0. 1.]]
  
[[1. 1. 1. 0.]
 [1. 1. 0. 1.]]

数组叠加合并
列合并/扩展:np.column_stack()
行合并/扩展:np.row_stack()

a = np.array((1,2,3,4))
b = np.array((4,5,6,7))
res1 = np.column_stack((a,b))
res2 = np.row_stack((a,b))
print(a)
print(b)
print(res1)
print(res2)
[1 2 3 4]
[4 5 6 7]
[[1 4]
 [2 5]
 [3 6]
 [4 7]]
[[1 2 3 4]
 [4 5 6 7]]

数组均分(np.array.split())

x = np.arange(10)
res1 = np.array_split(x,2)
res2 = np.array_split(x,3)
print(res1)
print(res2)
[array([0, 1, 2, 3, 4]), array([5, 6, 7, 8, 9])]
[array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8, 9])]

矩阵、列表、数组的转换

from numpy import *
#列表
a1=[[1,2],[3,2],[5,2]]
#将列表转化为二维数组
a2=array(a1)
#将列表转化为矩阵
a3=mat(a1)
#将矩阵转化为数组
a4=array(a3)
#将矩阵转化为列表
a5=a3.tolist()
#将数组转化为列表
a6=a2.tolist()

数组的基本用法

**np.array()创建 **

import numpy as np
a=[1,2,3]
b=np.array(a)
print(b)
[1 2 3]

Numpy查看数组属性

import numpy as np
a=np.array([1,2,3])
#查看数组元素个数
print(a.size)
#查看数组形状
print(a.shape)
#查看数组维度
print(a.ndim)
#查看数组元素类型
print(a.dtype)
3
(3,)
1
int32

数组的基本操作
1、索引

arr=np.random.randint(0,10,(2,2))
print(arr)
print(arr[1,1])

2、切片

#切片时,左闭右开
arr=np.random.randint(0,10,(4,4))
print(arr,'\n')
print(arr[:3,:2])
[[0 1 6 0]
 [1 4 4 3]
 [9 4 2 7]
 [8 9 0 6]] 

[[0 1]
 [1 4]
 [9 4]]

3、变形

arr=np.array([1,2,3,4])
arr1=arr.reshape(2,2)
print(arr1)
[[1 2]
 [3 4]]

4、级联
np.concatenate()级联需要注意的点:
1.级联的参数是列表:一定要加中括号或小括号
2.维度必须相同
3.形状相符
4.【重点】级联的方向默认是shape这个tuple的第一个值所代表的维度方向
5.可通过axis参数改变级联的方向

#级联
n1=np.array([[1,2],[3,4]])
b=np.concatenate((n1,n1),axis = 0) #axis=0表示行级联,axis=1表示列级联
print(b)
[[1 2]
 [3 4]
 [1 2]
 [3 4]]

np.hstack与np.vstack
水平级联与垂直级联,处理自己。进行维度的变更

n1=np.array([1,2,3,4])
n2=np.vstack(n1)   #垂直级联
n3=np.hstack(n2) #水平级联
print(n2,"\n\n",n3)
[[1]
 [2]
 [3]
 [4]] 

 [1 2 3 4]

5、切分
与级联类似,常用函数:
np.split
np.vsplit
np.hsplit

n4 = np.random.randint(0,10,size=(5,7))
print(n4)
print(np.split(n4,(1,3)),'\n\n')  #切分为1行2列,默认axis=0
print(np.split(n4,(1,3),axis=1),'\n\n')  #水平切分,即按照行切分
print(np.vsplit(n4,(1,3)),'\n\n')#垂直切分,即按照列切分
print(np.hsplit(n4,(1,3)))#水平切分
[[9 2 2 2 1 7 4]
 [8 7 1 5 7 8 1]
 [4 0 1 6 5 8 9]
 [0 9 1 0 8 0 1]
 [9 6 7 0 1 7 8]]
[array([[9, 2, 2, 2, 1, 7, 4]]), array([[8, 7, 1, 5, 7, 8, 1],
       [4, 0, 1, 6, 5, 8, 9]]), array([[0, 9, 1, 0, 8, 0, 1],
       [9, 6, 7, 0, 1, 7, 8]])] 


[array([[9],
       [8],
       [4],
       [0],
       [9]]), array([[2, 2],
       [7, 1],
       [0, 1],
       [9, 1],
       [6, 7]]), array([[2, 1, 7, 4],
       [5, 7, 8, 1],
       [6, 5, 8, 9],
       [0, 8, 0, 1],
       [0, 1, 7, 8]])] 


[array([[9, 2, 2, 2, 1, 7, 4]]), array([[8, 7, 1, 5, 7, 8, 1],
       [4, 0, 1, 6, 5, 8, 9]]), array([[0, 9, 1, 0, 8, 0, 1],
       [9, 6, 7, 0, 1, 7, 8]])] 


[array([[9],
       [8],
       [4],
       [0],
       [9]]), array([[2, 2],
       [7, 1],
       [0, 1],
       [9, 1],
       [6, 7]]), array([[2, 1, 7, 4],
       [5, 7, 8, 1],
       [6, 5, 8, 9],
       [0, 8, 0, 1],
       [0, 1, 7, 8]])]

6、矩阵的广播
ndarray广播的两条规则:
规则一:为缺失的维度补1
规则二:假定缺失元素用已有值填充

#实例2:a = np.arange(3).reshape((3,1)) b = np.arange(3) 求a+b
a = np.arange(3).reshape((3,1))
b = np.arange(3)
print(a,'\n\n',b,'\n\n')
print(a+b)
[[0]
 [1]
 [2]] 

 [0 1 2] 

[[0 1 2]
 [1 2 3]
 [2 3 4]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值