python学习笔记(3)--矩阵相关、numpy基础

文章目录


##0.导入numpy

#!/usr/bin/env python3 
# -*- coding: utf-8 -*-

import numpy as np
#from numpy import * 和 import numpy as np的区别
#当我们使用from * 的时候,会取得模块顶层左右赋值的变量名的拷贝。。
#后者是通过模块名获取变量名
#在实践中, "from module import *" 不是良好的编程风格,如果使用from导入变量,且那些变量碰巧和作用域中现有变量同名,那么变量名就会被悄悄覆盖掉。使用import语句的时候就不会发生这种问题,因为我们是通过模块名才获取的变量名,像module.attr不会和现有作用域的attr冲突。
# 显示numpy版本信息
print (np.version.version)

##1.创建数组/矩阵

# 以List或tuple产生一维数组
print (np.array([1, 2, 3, 4]))
print (np.array((1.2, 2, 3.3, 4)))

# 以List或tuple产生二维数组
a = np.array([[1, 2], [3, 4]])
print (a)
# 生成数组时指定数据类型
a = np.array((1.2, 2, 3, 4), dtype = np.int32)
print (a)
# 以np.zeros创建三维数组
a = np.zeros((2, 2, 2))
print (a)

# 使用arange生成数组
a = np.arange(15) # 生成0-14 共15个数字 
print (a)

# 使用reshape生成3*5数组
a = np.arange(15).reshape(3, 5)
print (a)

# 从1到10产生5个数
a = np.linspace(1, 10, 5)
print (a)

# 使用numpy.zeros, numpy.ones, numpy.eye方法构造特定矩阵
a = np.zeros((3, 4))
print (a)

a = np.ones((5, 5))
print (a)

a = np.eye(3)
print (a)

# 生成随机矩阵
# np.random.rand(a, b):生成a行b列的矩阵,随机的浮点数,范围在[0,1)。
a = np.random.rand(2, 3)
print (a)
# np.random.randint(low, high, size):生成形状为size的随机矩阵
# 矩阵的每一个元素都是整数,且范围在[low,high)之间。
a = np.random.randint(0, 10, (2, 3))
print (a)

# python中 list 与数组的互相转换
#list转array
#np.array(a)
#array 转list
#a.tolist()

##2.获得矩阵属性

# 2.获得数组的属性
a = np.zeros((2, 3))
print ("维度:", a.ndim)
print ("矩阵每一维的大小:", a.shape)
print ("数组的元素数:", a.size)
print ("数组的元素类型:", a.dtype)
print ("每个元素所占的字节数:", a.itemsize)

##3.矩阵操作

# 3.数组操作

# 数组索引
a = np.array([[1, 2, 3], [4, 5, 6]])
print (a)
print ("a[1, 2] =", a[1, 2])
# 数组切片
print ("a[1, :] =", a[1, :])
print ("a[1, 1:2] =", a[1, 1:2])
# for 循环遍历矩阵
print ("for循环遍历行:")
for row in a:
	print(row)
print ("for循环遍历列:")
for col in np.transpose(a):
	print(col)

# 数组赋值
a[1, :] = [7, 8, 9]
print (a)

# 合并数组
b = np.eye(2)
c = np.eye(3)
print ("水平合并:\n",np.hstack((a, b))) # 水平合并
print ("竖直合并:\n",np.vstack((a, c))) # 竖直合并
# 给矩阵添加行或列
print (np.r_[a, c])  # 添加行
print (np.c_[a, b])  # 添加列

注:在使用合并数组或给矩阵添加行列时,不改变原有矩阵的行列数,见下面代码:

#!/usr/bin/env python3 
# -*- coding: utf-8 -*-
import numpy as np

a = np.array([[2,2], [2,2]])
print(a)
b = np.array([[2],[2]])
print(b)

k = np.c_[a, b]
print(a.shape) #结果为(2,2)
print(k.shape) #结果为(2,3)

##4.基本的数组运算

# 4.基本的数组运算
# 4.1使用数组对象自带的方法
print ("a.sum =", a.sum())
print ("a.sum(axis = 0) =", a.sum(axis = 0)) #计算每一列的和
print ("a.min =", a.min())

# 4.2使用numpy下的方法
print (np.sin(a))
print (np.floor(a))
print (np.exp(a))

##5.基本的矩阵运算

import numpy.linalg as nplg #numpy.linalg模块中有很多关于矩阵运算的方法

###5.1 矩阵的加减乘(矩阵乘法、数乘)除

# 5.1 矩阵的加减乘(矩阵乘法、数乘)除
a = np.ones([2, 2])
b = np.eye(2)
print (a)
print (b)
print (a + b)
print (b * 2)
print (a * b)        # 数乘:每个元素对应相乘
print (np.dot(a, b)) # 矩阵乘法
print (b / (a * 2))  # 每个元素对应相除
print ((a * 2) ** 4) # 每个元素对应的4次方

###5.2 线性代数运算

# 5.2 线性代数运算
a = np.array([[1, 0], [2, 3]])
print (a)
b = np.mat([[1, 2], [3, 4]])
print ("b = \n", b)
# 矩阵的转置
a = a.transpose()
print ("矩阵的转置:\n", a)
print ("矩阵的转置:\n", b.T)
# 矩阵的迹:方阵主对角线上元素之和
print ("矩阵的迹:\n",np.trace(a))
# 矩阵求逆
print ("矩阵的逆:\n",np.linalg.inv(a))
print ("矩阵的逆:\n", b.I)
# 计算行列式
print ("行列式:\n",np.linalg.det(a))
# 特征值特征向量
print ("特征值特征向量:\n",nplg.eig(a))
# 向量的最大最小值、加和、平均值、范数
print(np.sum(a)) # >>> 47
print(np.max(a)) # >>> 9
print(np.min(a)) # >>> 0
print(np.average(a)) # >>> 4.7
print(np.linalg.norm(a)) # >>> 18.1383571472

# 向量内积
v1 = np.array([1, 2, 3])
v2 = np.array([2, 3, 4])
print (np.inner(v1, v2))

# 求范数
x = np.array([[0, 3, 4], [2, 6, 4]])
y = np.linalg.norm(x, axis = 1)
print ("x = \n", x)
print ("向量x的一范数y = ", y)

a=np.array([[complex(1,-1),3],[2,complex(1,1)]])  
print(a)
print("矩阵2的范数")
print(np.linalg.norm(a,ord=2) )   #计算矩阵2的范数
print("矩阵1的范数")
print(np.linalg.norm(a,ord=1) )   #计算矩阵1的范数
print("矩阵无穷的范数")
print(np.linalg.norm(a,ord=np.inf) )

###5.3 矩阵的轴参数

轴(axis)表示的是矩阵的维度,以下图为例:
这里写图片描述

>>>df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]], \
columns=["col1", "col2", "col3", "col4"])
>>>df
   col1  col2  col3  col4
    0     1     1     1     1
    1     2     2     2     2
    2     3     3     3     3
如果我们调用df.mean(axis=1),我们将得到按行计算的均值
>>> df.mean(axis=1)
0    1
1    2
2    3

简单的来记就是axis=0代表跨行(down),而axis=1代表跨列(across)。

换句话说:
使用0值表示沿着每一列或行标签\索引值向下执行方法
使用1值表示沿着每一行或者列标签模向执行对应的方法

https://www.cnblogs.com/rrttp/p/8028421.html


教程1:
https://www.jb51.net/article/49397.htm
教程2:
https://blog.csdn.net/guoziqing506/article/details/71078576

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值