python画函数图像要用到的模块_教你如何绘制数学函数图像——numpy和matplotlib的简单应用...

numpy和matplotlib的简单应用

一、numpy库

1.什么是numpy

NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。

numpy是科学计算包,支持N维数组运算、处理大型矩阵、成熟的广播函数库、矢量运算、线性代数、傅里叶变换、随机数生成,并可与C++/Fortran语言无缝结合。

2.numpy的安装

在Python v3中默认安装已经包含了numpy

如果没有安装,可以在命令行(ctrl+R,输入cmd)中输入pip install numpy即可自动安装使用

1629853-20190422210253346-723137485.png

3.numpy的使用

注意:这里的矩阵跟线性代数(高等代数)中的矩阵一致,运算方法一致

(1)导入模块

import numpy as np #用np来代替numpy

(2)生成数组(创建数组)

1 importnumpy as np2 print(np.array([1, 2, 3, 4, 5])) #把列表转换为数组

3 print(np.array((1, 2, 3, 4, 5))) #把元组转换成数组

4 print(np.array(range(5))) #把range对象转换成数组

5 print(np.array([[1, 2, 3], [4, 5, 6]])) #二维数组

6 print(np.arange(8)) #类似于内置函数range()

7 print(np.arange(1, 10, 2))8 print(np.linspace(0, 10, 11)) #等差数组,包含11个数

9 print(np.linspace(0, 10, 11, endpoint=False)) #不包含终点

10 print(np.logspace(0, 100, 10)) #对数数组

11 print(np.logspace(1,6,5, base=2)) #对数数组,相当于2 ** np.linspace(1,6,5)

12 print(np.zeros(3)) #全0一维数组

13 print(np.ones(3)) #全1一维数组

14 print(np.zeros((3,3))) #全0二维数组,3行3列

15 print(np.zeros((3,1))) #全0二维数组,3行1列

16 print(np.zeros((1,3))) #全0二维数组,1行3列

17 print(np.ones((1,3))) #全1二维数组

18 print(np.ones((3,3))) #全1二维数组

19 print(np.identity(3)) #单位矩阵

20 print(np.identity(2))21 print(np.empty((3,3))) #空数组,只申请空间而不初始化,元素值是不确定的

结果如图所示(因为是一次性输出全部,所以显示不是很好)

1629853-20190422212711155-1294852566.png

(3)数组的运算

1/ 数组与数值的运算

x=np.array((1,2,3,4,5)) #创建数组

x*2    #乘法

x/2   #除法

x//2   #整除

x**3   #幂次方

x+2   #加法

x%3   #求余

2**x #2的(x中的每一个元素)次方,同时生成另一个数组

2/x   #2除以x中的每一个元素,同时生成另外一个数组

63//x #63除以x中的每一个元素,取整数,同时生成另外一个数组

2/ 数组与数组的运算

a= np.array((1,2,3)) #先创建两个数组

b=np.array(([1,2,3],[4,5,6],[7,8,9]))

数组之间的基本运算

c=a*b

c/b

a+a

a*a

c-a

c/a

(4) 数组的转置

b=np.array(([1,2,3],[4,5,6],[7,8,9]))

1629853-20190422214841228-62178946.png

b.T #转置

1629853-20190422214901545-632568396.png

值得注意的是:一维数组转置以后和原来是一样的

(5)点积和内积

a = np.array((5, 6, 7)) #创建数组a

b = np.array((6, 6, 6)) #创建数组b

a.dot(b)         #向量内积

np.dot(a,b)

c = np.array(([1,2,3],[4,5,6],[7,8,9]))       # 二维数组

c.dot(a)        # 二维数组的每行与一维向量计算内积

a.dot(c)                # 一维向量与二维向量的每列计算内积

(6) 元素访问

b = np.array(([1,2,3],[4,5,6],[7,8,9]))

b[0]                    # 第0行

b[0][0]                         # 第0行第0列的元素值

b[0,2]                    # 第0行第2列的元素值

b[[0,1]]                    # 第0行和第1行

b[[0,1], [1,2]]                    #第0行第1列的元素和第1行第2列的元素

x = np.arange(0,100,10,dtype=np.floating)

x[[1, 3, 5]]              # 同时访问多个位置上的元素

x[[1, 3, 5]] = 3              # 把多个位置上的元素改为相同的值

x[[1, 3, 5]] = [34, 45, 56]              # 把多个位置上的元素改为不同的值

(7)数组支持函数运算

np.sin(x)             #求正弦值

np.cos(x)                        #求余弦值

np.round(_)                       #四舍五入

x = np.random.rand(10) * 10     # 包含10个随机数的数组

np.floor(x)           # 所有元素向下取整

np.ceil(x)                        # 所有元素向上取整

(8) 改变数组大小

a = np.arange(1, 11, 1) #创建一维数组

a.shape = 2, 5                     #将数组改为2行5列

a.shape = 5, -1         #将元素分成5列, -1表示自动计算,原地修改

b = a.reshape(2,5)          # reshape()方法返回新数组

(9) 切片操作

a[::-1]            # 反向切片

a[::2]            # 隔一个取一个元素

a[:5]            # 前5个元素

c[0, 2:5]                   # 第0行中下标[2,5)之间的元素值

c[1]                  # 第1行所有元素

c[2:5, 2:5]                  # 行下标和列下标都介于[2,5)之间的元素值

(10) 布尔运算(结果一般是True或者False显示)

x > 0.5                  # 比较数组中每个元素值是否大于0.5

x[x>0.5]                  # 获取数组中大于0.5的元素,可用于检测和过滤异常值

x < 0.5

np.all(x<1)                        # 测试是否全部元素都小于1

np.any([1,2,3,4])                # 是否存在等价于True的元素

a > b                 # 两个数组中对应位置上的元素比较

a[a>b]                         #输出相对应元素a>b的元素位置

(11)取整运算

x = np.random.rand(10)*50              # 10个随机数

np.int64(x)                       # 取整

np.int32(x)

(12)广播

a = np.arange(0,60,10).reshape(-1,1)        # 创建列向量

b = np.arange(0,6)         # 创建行向量

a[0] + b         # 数组与标量的加法

a + b                          #行向量与列向量的相加

a*b                           #行向量与列向量的相乘

(13) 计算唯一值以及出现的次数

x = np.random.randint(0, 10, 7) #创建0到10之间的随机数,个数为7

np.bincount(x)                     #计算元素出现的次数,由最小的元素开始,到最大值

np.sum(_)                     # 所有元素出现次数之和等于数组长度

np.unique(x)                     # 返回唯一元素值

(14) 矩阵运算

a_list = [3, 5, 7]

a_mat = np.matrix(a_list)          # 创建矩阵

a_mat.T           # 矩阵转置

a_mat.shape           # 矩阵形状

a_mat.size           # 元素个数

a_mat.mean()         # 元素平均值

a_mat.sum() # 所有元素之和

a_mat.max() # 最大值

a_mat.max(axis=1)           # 横向最大值

a_mat.max(axis=0)                   # 纵向最大值

a_mat * b_mat.T          # 矩阵相乘

c_mat = np.matrix([[1, 5, 3], [2, 9, 6]]) # 创建二维矩阵

c_mat.argsort(axis=0) # 纵向排序后的元素序号

c_mat.argsort(axis=1)        # 横向排序后的元素序号

d_mat.diagonal() # 矩阵对角线元素

x = np.matrix(np.random.randint(0, 10, size=(3,3)))

x.std()            # 标准差

x.std(axis=1)          # 横向标准差

x.std(axis=0)             # 纵向标准差

x.var(axis=0)                      # 纵向方差

二、matplotlib库

1.什么是matplotlib库

matplotlib模块依赖于numpy模块和tkinter模块,可以绘制多种形式的图形,包括线图、直方图、饼状图、散点图、误差线图等等。

2.matplotlib库的安装

在命令行(ctrl+R,输入cmd)中输入pip install matplotlib即可自动安装使用

1629853-20190423000248281-1437493696.png

3.matplotlib库的的使用

导入

import matplotlib

绘制正弦函数图像

1 importnumpy as np2 importpylab as pl3

4 t = np.arange(0.0, 2.0*np.pi, 0.01) #生成数组,0到2π之间,以0.01为步长

5 s = np.sin(t) #对数组中所有元素求正弦值,得到新数组

6 pl.plot(t,s) #画图,以t为横坐标,s为纵坐标

7 pl.xlabel('x') #设置坐标轴标签

8 pl.ylabel('y')9 pl.title('sin') #设置图形标题

10 pl.show() #显示图形

结果如图所示

1629853-20190424101005595-949605458.png

绘制散点图

1 importnumpy as np2 importpylab as pl3 a = np.arange(0, 2.0*np.pi, 0.1)4 b =np.cos(a)5 pl.scatter(a,b)6 pl.show()

结果如图所示

1629853-20190424115741221-2049738362.png

绘制带有中文标签和图例的图像

1 importnumpy as np2 importpylab as pl3 importmatplotlib.font_manager as fm4

5 myfont = fm.FontProperties(fname=r'C:\Windows\Fonts\STKAITI.ttf') #设置字体

6 t = np.arange(0.0, 2.0*np.pi, 0.01) #自变量取值范围

7 s = np.sin(t) #计算正弦函数值

8 z = np.cos(t) #计算余弦函数值

9 pl.plot(t, s, label='正弦')10 pl.plot(t, z, label='余弦')11 pl.xlabel('x-变量', fontproperties='STKAITI', fontsize=18) #设置x标签

12 pl.ylabel('y-正弦余弦函数值', fontproperties='simhei', fontsize=18)13 pl.title('sin-cos函数图像', fontproperties='STLITI', fontsize=24)14 pl.legend(prop=myfont) #设置图例

15 pl.show()

结果如图所示

1629853-20190424120317091-361136788.png

等等~~~~~~~~~~~~~~~

三、用雷达图表示python123中的成绩数据

1 importnumpy as np2 importmatplotlib.pyplot as plt3 importmatplotlib4 matplotlib.rcParams['font.family']='LiSu'#定义字体

5 matplotlib.rcParams['font.sans-serif'] = ['LiSu']6 labels=np.array(['第一周','第二周','第三周','第四周','第五周','第六周'])#定义标签

7 data=np.array([8,10,9,10,11,7])8 angles=np.linspace(0,2*np.pi,6,endpoint=False)9 data=np.concatenate((data,[data[0]]))10 angles=np.concatenate((angles,[angles[0]]))11 fig=plt.figure(facecolor="yellow")#颜色设置

12 plt.subplot(111,polar=True)13 plt.plot(angles,data,'bo-',color='g',linewidth=2)14 plt.fill(angles,data,facecolor='g',alpha=0.25)15 plt.thetagrids(angles*180/np.pi,labels)16 plt.figtext(0.52,0.95,'xiayiLL的python123成绩雷达图',ha='center')#图像命名

17 plt.grid(True)18 plt.show()

结果如图所示

1629853-20190424124525310-1507329759.png

四、自定义手绘风

代码如下

1 #-*- coding: utf-8 -*-

2

3 '''手绘图像效果'''

4 importnumpy as np5 from PIL importImage6 vec_el = np.pi/2.2 #光源的俯视角度,弧度值

7 vec_az = np.pi/4. #光源的方位角度,弧度值

8 depth = 6. #深度权值,值越小背景区域越接近白色,值越大背景区域越接近黑色

9 im = Image.open('C:\\Users\Administrator\Desktop\spyder\路飞.jpg').convert('L') #打开图像并转变为灰度模式

10 a = np.asarray(im).astype('float')11 grad = np.gradient(a) #取图像灰度的梯度值

12 grad_x, grad_y = grad #分别取图像的横纵梯度值

13 grad_x = grad_x * depth / 100.14 grad_y = grad_y * depth / 100.15 dx = np.cos(vec_el) * np.cos(vec_az) #光源对x轴的影响

16 dy = np.cos(vec_el) * np.sin(vec_az) #光源对y轴的影响

17 dz = np.sin(vec_el) #光源对z轴的影响

18 A = np.sqrt(grad_x**2 + grad_y**2 + 1.)19 uni_x = grad_x/A20 uni_y = grad_y/A21 uni_z = 1./A22 a2 = 255*(dx * uni_x + dy * uni_y + dz * uni_z) #光源归一化

23 a2 = a2.clip(0, 255) #预防溢出

24 im2 = Image.fromarray(a2.astype('uint8')) #重构图像

25 im2.save('HandMade_.jpg') #保存图像

26 im2.show() #显示图像

原图如下

1629853-20190424125532419-1282439086.png

经代码转变手绘图

1629853-20190424125433374-1069787625.png

五、感兴趣的图像

分段函数图像,代码如下

1 importnumpy as np2 importmatplotlib.pyplot as plt3

4 x = np.linspace(0,100,1000)5 interval0 = [1 if (i<30) else 0 for i inx]6 interval1 = [1 if (i>=30 and i<50) else 0 for i inx]7 interval2 = [1 if (i>=50) else 0 for i inx]8 y = np.cos(x)* interval0 + x * interval1 + np.sin(x)*interval29 plt.plot(x,y)10 plt.show()

结果如图所示

1629853-20190424131854038-685661682.png

loading.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

台式电脑如何使用无线网,wifi怎么连接?

随着网络的发展&#xff0c;现在无线路由器已经深入到寻常百姓家了&#xff0c;无线信号满街都是&#xff0c;但是作为台式电脑&#xff0c;却不具备wifi自动连接这个功能。那么&#xff0c;台式电脑怎么用wifi呢&#xff1f;下面小编就教大家wifi如何连接。1、电脑必须安装一块…

软件测试的缺陷管理系统有哪些,简述:一款优秀的缺陷管理系统有哪些功能特点!...

原标题&#xff1a;简述&#xff1a;一款优秀的缺陷管理系统有哪些功能特点&#xff01;什么是缺陷管理系统&#xff1f;缺陷管理系统指的是在软件生命周期中识别、管理、沟通任何缺陷的过程(从缺陷的识别&#xff0c;到缺陷的解决关闭)&#xff0c;确保缺陷被跟踪管理而不丢失…

JVM——类加载机制

虚拟机把描述类的数据从Class文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的Java类型&#xff0c;这就是虚拟机的类加载机制。 在Java语言中&#xff0c;类型的加载、连接和初始化过程都是在程序运行期间完成的&…

操作系统基础知识笔记

一、操作系统相关概念 计算机软件&#xff1a;系统软件和应用软件。 计算机系统资源&#xff1a;硬件资源、软件资源。 硬件资源&#xff1a;中央处理器、存储器、输入、输出等物理设备。 软件资源&#xff1a;以文件形式保存到存储器上的程序和数据信息。 定义&#xff1a;有效…

python一般学多久可以考试_为何Python适合初学者 一般Python要学习多久

为何Python适合初学者?一般Python要学习多久?很多人都觉得&#xff0c;Python是一门很好学的语言&#xff0c;非常适合入门。但更多人都是不清楚具体原因的。那么&#xff0c;我们不如一起来看看Python为何更适合初学者&#xff0c;为何更适合学习吧。另外&#xff0c;这门伟…

操作系统基础:进程知识笔记(一)

进程介绍 进程管理也称为处理机管理。进程主要是为了解决多道程序批处理系统和分时系统中针对多个并发执行的程序&#xff0c;用来描述系统中执行时动态变化过程。进程属于自愿分配和独立运行的基本单位。 1、进程的概念知识 1.1 程序顺序执行的特征 程序顺序执行的特征&#x…

JVM——三个ClassLoader详解

类装载工作由ClassLoader及其子类负责&#xff0c;ClassLoader是一个重要的Java执行时系统组件&#xff0c;它负责在运行时查找和装入Class字节码文件。JVM在运行时会产生三个ClassLoader&#xff1a;根装载器、ExtClassLoader&#xff08;扩展类装载器&#xff09;和AppClassL…

c++头文件_51单片机C语言编程知多少:几人不知头文件,你要的干货在这里了

近期写了一些比较大的单片机程序&#xff0c;找了很多参考资料&#xff0c;看了大量别人的程序。我从中发现了自己对于C语言编程还只是知道如何实现功能&#xff0c;但对编程规范掌握的不好&#xff0c;编程习惯也没有很好的养成。学了这么久的单片机&#xff0c;还真是挺难为情…

最常问的MySQL面试题集合

除了基础题部分&#xff0c;本文还收集整理的MySQL面试题还包括如下知识点或题型&#xff1a;MySQL高性能索引SQL语句MySQL查询优化MySQL高扩展高可用MySQL安全性问题1&#xff1a;char、varchar的区别是什么&#xff1f;varchar是变长而char的长度是固定的。如果你的内容是固定…

计算机打印机共享失败,局域网共享打印机连接失败怎么办

在局域网中由于办公需要&#xff0c;经常要连接网络打印机&#xff0c;但是有时候就无法连接&#xff0c;提示各种连接失败&#xff0c;下面是学习啦小编给大家整理的一些有关局域网共享打印机连接失败的解决方法&#xff0c;希望对大家有帮助!局域网共享打印机连接失败的解决方…

idea 中代码大小写切换快捷键

idea用使用 CTRL SHIFT U 使用前&#xff1a; 使用后&#xff1a;

nginx做服务器入口_Nginx实现http反向代理

什么是反向代理&#xff1f;反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受internet上的连接请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;并将从服务器上得到的结果返回给internet上请求连接的客户端&#xff0c;此时代理服务器…

操作系统基础:进程知识笔记(二)

一、管程 1、管道概念概念 管道是用于连接一个读进程和一个写进程。用来实现它们之间通信的共享文件。 2、管程的概念 管程是由一些共享数据、一组能为并发进程所执行的作用在共享数据上的操作集合、初始代码、以及存取权组成。管程提供了一种可以允许多线程安全、有效地共享抽…

怎样保护计算机连接线,一根网线把电脑烧了:雷雨天如何保护家电?

记得在小时候&#xff0c;每逢遇到雷雨天气&#xff0c;爸妈总会让我们关掉电视机、电脑等家电&#xff0c;虽然很不情愿&#xff0c;但为了避免电器遭受雷击造成损坏&#xff0c;我们还是会照做。现在长大了&#xff0c;除了知其然&#xff0c;还更要知其所以然&#xff0c;那…

HDU5697 刷题计划 dp+最小乘积生成树

分析&#xff1a;就是不断递归寻找靠近边界的最优解 学习博客&#xff08;必须先看这个&#xff09;&#xff1a; 1&#xff1a;http://www.cnblogs.com/autsky-jadek/p/3959446.html 2&#xff1a;http://blog.csdn.net/u013849646/article/details/51524748 注&#xff1a;这…

分享我常用的5个免费的在线 SQL 数据库环境,简直太方便了!

大今天给大家分享几个在线的免费 SQL 运行环境&#xff0c;也就是在线数据库。这些网站可以帮助我们快速运行一些 SQL 语句的测试或者验证&#xff0c;同时还可以在网络上进行分享&#xff0c;关键不需要自己安装数据库。SQL FiddleSQL Fiddle 提供了 MySQL、Oracle、PostgreSQ…

r语言 面板数据回归_R语言_018回归

回归分析是统计学的核心。它其实是一个广义的概念&#xff0c;指那些用一个或多个预测变量来预测响应变量的方法。通常&#xff0c;回归分析可以用来挑选与响应变量相关的解释变量&#xff0c;可以描述两者的关系&#xff0c;也可以生成一个等式&#xff0c;通过解释变量来预测…

Integer对象范围(-128-127)之间(Integer. valueOf()方法)

1.Integer. valueOf()方法的作用 Integer. valueOf()可以将基本类型int转换为包装类型Integer&#xff0c;或者将String转换成Integer&#xff0c;String如果为Null或“”都会报错 看下面代码示例 取值为127时 取值为128时 为什么会是这样呢&#xff1f; 首先&#xff0c;我们…

操作系统基础:进程知识笔记(三)

1、死锁概念知识 计算机中存在许多互斥资源&#xff08;打印机&#xff09;、软件资源&#xff08;进程表、临界区&#xff09;如果两个进程同时调用打印机&#xff0c;或同时进入临界区必然会出现问题。 死锁&#xff1a;指两个以上的进程互相要求对方已经占有的资源导致无法继…