【Python学习笔记】18:numpy数组函数与矩阵运算

数组支持函数运算

>>> x=np.arange(0,100,10,dtype=np.floating)
>>> np.sin(x) #对每个元素计算正弦
array([ 0.        , -0.54402111,  0.91294525, -0.98803162,  0.74511316,
       -0.26237485, -0.30481062,  0.77389068, -0.99388865,  0.89399666])
>>> np.round(_) #四舍五入
array([ 0., -1.,  1., -1.,  1., -0., -0.,  1., -1.,  1.])
>>> x=np.random.rand(7)*10
>>> x
array([ 1.42224316,  3.95003135,  8.04936975,  9.77336697,  1.86243496,
        1.51027865,  2.89026918])
>>> np.floor(x) #向下取整
array([ 1.,  3.,  8.,  9.,  1.,  1.,  2.])
>>> np.ceil(x) #向上取整
array([  2.,   4.,   9.,  10.,   2.,   2.,   3.])

对数组的函数运算也就是对每个元素的函数运算,对多维数组也是可行的。

>>> x=np.linspace(0,3.14,10)
>>> x
array([ 0.        ,  0.34888889,  0.69777778,  1.04666667,  1.39555556,
        1.74444444,  2.09333333,  2.44222222,  2.79111111,  3.14      ])
>>> y=np.cos(x)
>>> y
array([ 1.        ,  0.93975313,  0.76627189,  0.50045969,  0.17434523,
       -0.17277674, -0.4990802 , -0.76524761, -0.93920748, -0.99999873])
>>> np.arccos(y)
array([ 0.        ,  0.34888889,  0.69777778,  1.04666667,  1.39555556,
        1.74444444,  2.09333333,  2.44222222,  2.79111111,  3.14      ])
>>> np.absolute([-3,-2]) #绝对值
array([3, 2])
>>> np.absolute([3+4j,2+1j]) #复数的模
array([ 5.        ,  2.23606798])
>>> np.log2(8) #对数
3.0
>>> np.log10(100)
2.0
>>> np.multiply([1,2,3],[4,5,6])
array([ 4, 10, 18])
>>> np.multiply(3,[4,5,6])
array([12, 15, 18])
>>> x=np.array([4,5,6])
>>> np.multiply(3,x)
array([12, 15, 18])
>>> np.multiply([1,2,3],x)
array([ 4, 10, 18])

可见multiply可以让标量、数组或list相乘。

>>> np.sqrt(x)
array([ 2.        ,  2.23606798,  2.44948974])
>>> np.sqrt([1,4,9])
array([ 1.,  2.,  3.])

矩阵运算

>>> a_list=[3,5,7]
>>> a_mat=np.matrix(a_list) #用list对象去创建矩阵对象
>>> a_mat
matrix([[3, 5, 7]])
>>> a_mat.T #转置但不改变原矩阵
matrix([[3],
        [5],
        [7]])
>>> a_mat.shape #矩阵形状(行数,列数)
(1, 3)
>>> a_mat
matrix([[3, 5, 7]])
>>> a_mat.size #元素个数
3#用list对象去创建矩阵对象
>>> a_mat
matrix([[3, 5, 7]])
>>> a_mat.T #转置但不改变原矩阵
matrix([[3],
        [5],
        [7]])
>>> a_mat.shape #矩阵形状(行数,列数)
(1, 3)
>>> a_mat
matrix([[3, 5, 7]])
>>> a_mat.size #元素个数
3
>>> b_mat=np.matrix((1,2,3)) #用tuple对象去创建矩阵对象
>>> b_mat
matrix([[1, 2, 3]])
>>> a_mat*b_mat.T #矩阵相乘
matrix([[34]])
>>> a_mat.mean() #元素平均值
5.0
>>> a_mat.sum() #元素和
15
>>> a_mat.max(axis=1) #列最大值
matrix([[7]])
>>> a_mat.max(axis=0) #行最大值
matrix([[3, 5, 7]])

列最大值横向一列一列去看,行最大值纵向一行一行去看。

>>> c_mat=np.matrix([[1,2,3],[3,2,1],[5,4,3]])
>>> c_mat.argsort(axis=0) #纵向排序后的元素序号
matrix([[0, 0, 1],
        [1, 1, 0],
        [2, 2, 2]], dtype=int64)
>>> c_mat.diagonal() #对角线元素
matrix([[1, 2, 3]])
>>> c_mat.flatten() #矩阵平铺
matrix([[1, 2, 3, 3, 2, 1, 5, 4, 3]])

当函数diagonal遇到的不是方阵时,返回(0,0),(1,1)..这样的元素直至超出界限。

>>> np.linalg.eig([[1,1],[2,2]]) #特征值和特征向量
(array([ 0.,  3.]), array([[-0.70710678, -0.4472136 ],
       [ 0.70710678, -0.89442719]]))
>>> np.cov([1,1,1,1,1]) #协方差
array(0.0)
>>> x=[-2.1,-1,4.3]
>>> y=[3,1.1,0.12]
>>> X=np.vstack((x,y)) #将x和y组合成一个矩阵
>>> X
array([[-2.1 , -1.  ,  4.3 ],
       [ 3.  ,  1.1 ,  0.12]])
>>> np.cov(X) #协方差
array([[ 11.71      ,  -4.286     ],
       [ -4.286     ,   2.14413333]])
>>> np.cov(x,y) #也可以直接这样用
array([[ 11.71      ,  -4.286     ],
       [ -4.286     ,   2.14413333]])

还可以作矩阵求逆,如下。

>>> x=np.matrix([[2,5],[-3,-7]])
>>> y=np.linalg.inv(x) #求x的逆矩阵
>>> y
matrix([[-7., -5.],
        [ 3.,  2.]])
>>> x*y #验证
matrix([[  1.00000000e+00,  -1.77635684e-15],
        [  0.00000000e+00,   1.00000000e+00]])
>>> y*x #验证
matrix([[ 1.,  0.],
        [ 0.,  1.]])

矩阵的不同维度上的计算

>>> x=np.arange(0,10).reshape(2,5) #修改矩阵形状
>>> x
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
>>> np.sum(x)
45
>>> np.sum(x,axis=0) #纵向求和
array([ 5,  7,  9, 11, 13])
>>> np.sum(x,axis=1) #横向求和
array([10, 35])
>>> np.mean(x,axis=0) #纵向计算算术平均值
array([ 2.5,  3.5,  4.5,  5.5,  6.5])
>>> weight=[0.3,0.7]
>>> np.average(x,axis=0,weights=weight) #纵向计算加权平均值
array([ 3.5,  4.5,  5.5,  6.5,  7.5])
>>> x=np.random.randint(0,10,size=(3,3)) #这次直接指定了形状
>>> x
array([[2, 6, 5],
       [7, 4, 7],
       [2, 4, 9]])
>>> np.std(x) #所有元素的标准差
2.23330569358242
>>> np.std(x,axis=1) #每行元素的标准差
array([ 1.69967317,  1.41421356,  2.94392029])

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值