解析媒体矩阵(MediaMatrix)(四十九)NWare软件应用(11)——Python编程基础(续5)
- 格式:pdf
- 大小:835.96 KB
- 文档页数:4
Python常⽤库Numpy进⾏矩阵运算详解Numpy⽀持⼤量的维度数组和矩阵运算,对数组运算提供了⼤量的数学函数库!Numpy⽐Python列表更具优势,其中⼀个优势便是速度。
在对⼤型数组执⾏操作时,Numpy的速度⽐Python列表的速度快了好⼏百。
因为Numpy数组本⾝能节省内存,并且Numpy在执⾏算术、统计和线性代数运算时采⽤了优化算法。
Numpy的另⼀个强⼤功能是具有可以表⽰向量和矩阵的多维数组数据结构。
Numpy对矩阵运算进⾏了优化,使我们能够⾼效地执⾏线性代数运算,使其⾮常适合解决机器学习问题。
与Python列表相⽐,Numpy具有的另⼀个强⼤优势是具有⼤量优化的内置数学函数。
这些函数使你能够⾮常快速地进⾏各种复杂的数学计算,并且⽤到很少代码(⽆需使⽤复杂的循环),使程序更容易读懂和理解。
注:在ndarray结构中,⾥⾯元素必须是同⼀类型的,如果不是,会⾃动的向下进⾏。
Numpy简单创建数组a = [1, 2, 3]b = np.array(a)c = np.array([[0, 1, 2, 10],[12, 13, 100, 101],[102, 110, 112, 113]], int)print(c)print(b)创建数值为1的数组Numpy.ones(参数 1:shape,数组的形状;参数 2:dtype,数值类型)array_one = np.ones([10, 10], dtype=np.int)print(array_one)创建数值为0的数组Numpy.zeros(参数 1:shape,数组的形状;参数 2:dtype,数值类型)array_zero = np.zeros([10, 9], dtype=np.float)print(array_zero)创建指定数值的数组Numpy.full(参数 1:shape,数组的形状;参数 2:constant value,数组填充的常数值;参数 3:dtype,数值类型)array_full = np.full((2, 3), 5)print(array_full)创建单位矩阵Numpy.eye(参数 1:N,⽅阵的维度)array_eye = np.eye(5)print(array_eye)创建对⾓矩阵Numpy.diag(参数1:v,主对⾓线数值,参数 2:k,对⾓线元素):K = 0表⽰主对⾓线,k>0的值选择在主对⾓线之上的对⾓线中的元素,k<0的值选择在主对⾓线之下的对⾓线中的元素array_diag = np.diag([10, 20, 30, 40])print(array_diag)Numpy查看数组属性数组元素个数:b.size 或 np.size()数组形状:b.shape 或 np.shape()数组维度:b.ndim数组元素类型:b.dtype# 数组元素个数:3print(b.size)# 数组形状:(3,)print(b.shape)# 数组维度:1print(b.ndim)# 数组元素类型:int32print(b.dtype)矩阵第⼀维的长度:shape[0] # ⾏矩阵第⼆维的长度:shape[1] # 列.......array_rand = np.random.rand(10, 10, 4)print(array_rand)print(array_rand.ndim)print(array_rand.shape[0])print(array_rand.shape[1])print(array_rand.shape[2])Numpy创建随机数组(np.random)均匀分布创建指定形状的数组,数值范围在0~1之间array_rand = np.random.rand(10, 10, 4)print(array_rand)print(array_rand.ndim)创建指定范围内的⼀个数:Numpy.random.uniform(low, high, size=None)array_uniform = np.random.uniform(0, 100, size=5)print(array_uniform)创建指定范围的⼀个整数:Numpy.random.randint(low, high, size=None)array_int = np.random.randint(0, 100, size=3)print(array_int)print(array_int.size)Numpy.arange()和Numpy.linspace()函数也可以均匀分布Numpy.arange(start, stop, step):创建⼀个秩为1的array,其中包含位于半开区间[start, stop)内并均匀分布的值,step表⽰两个相邻值之间的差。
Python是一种强大的编程语言,广泛应用于数据分析、科学计算等领域。
而在Python的科学计算库中,numpy可以说是应用最为广泛的了。
它提供了许多用于数据处理和科学计算的功能,使得数据处理和分析变得更加高效和简便。
本文将从实际应用的角度,介绍numpy在数据处理、科学计算等方面的应用实践。
一、 numpy的基本介绍numpy是Python的一个科学计算库,它提供了多维数组对象以及用于处理数组的各种函数。
它可以说是Python中数据分析和科学计算领域的基础库之一。
numpy的核心是ndarray对象,它是一个多维数组,而且有许多对数组进行处理的函数。
二、 numpy在数据处理中的应用1. 创建数组使用numpy可以轻松地创建一个多维数组,比如可以使用numpy.array()函数来创建一个数组,也可以通过numpy.arange()、numpy.zeros()、numpy.ones()等函数来创建特定形状的数组。
创建数组是进行数据处理和科学计算的第一步,而numpy提供了丰富的函数来满足不同的需求。
2. 数组的运算numpy可以对数组进行各种运算,包括加减乘除、矩阵乘法、幂运算等。
这些运算可以帮助我们对数据进行加工处理,从而得到我们想要的结果。
numpy还提供了许多数学函数,比如sqrt()、exp()、sin()、cos()等,这些函数可以对数组中的每个元素进行运算。
3. 数据的筛选和切片numpy提供了灵活强大的切片功能,可以用来对数组进行筛选和切片操作。
比如可以使用布尔索引、切片索引等方法来筛选出符合条件的数据,也可以使用切片来对数组进行切割等操作。
4. 数组的合并和拆分在数据处理过程中,有时需要对数组进行合并或者拆分操作,从而得到我们需要的结果。
numpy提供了concatenate()、vstack()、hstack()等函数来实现数组的合并操作,也提供了split()、hsplit()、vsplit()等函数来实现数组的拆分操作。
PythonNumpy数组的初始化和基本操作⼀.基础:Numpy的主要数据类型是ndarray,即多维数组。
它有以下⼏个属性:ndarray.ndim:数组的维数ndarray.shape:数组每⼀维的⼤⼩ndarray.size:数组中全部元素的数量ndarray.dtype:数组中元素的类型(numpy.int32, numpy.int16, and numpy.float64等)ndarray.itemsize:每个元素占⼏个字节例⼦:>>> import numpy as np>>> a = np.arange(15).reshape(3, 5)>>> aarray([[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]])>>> a.shape(3, 5)>>> a.ndim2>>> 'int64'>>> a.itemsize8>>> a.size15>>> type(a)<type 'numpy.ndarray'>>>> b = np.array([6, 7, 8])>>> barray([6, 7, 8])>>> type(b)<type 'numpy.ndarray'>⼆.创建数组:使⽤array函数讲tuple和list转为array:>>> import numpy as np>>> a = np.array([2,3,4])>>> aarray([2, 3, 4])>>> a.dtypedtype('int64')>>> b = np.array([1.2, 3.5, 5.1])>>> b.dtypedtype('float64')多维数组:>>> b = np.array([(1.5,2,3), (4,5,6)])>>> barray([[ 1.5, 2. , 3. ],[ 4. , 5. , 6. ]])⽣成数组的同时指定类型:>>> c = np.array( [ [1,2], [3,4] ], dtype=complex )>>> carray([[ 1.+0.j, 2.+0.j],[ 3.+0.j, 4.+0.j]])⽣成数组并赋为特殊值:ones:全1zeros:全0empty:随机数,取决于内存情况>>> np.zeros( (3,4) )array([[ 0., 0., 0., 0.],[ 0., 0., 0., 0.],[ 0., 0., 0., 0.]])>>> np.ones( (2,3,4), dtype=np.int16 ) # dtype can also be specifiedarray([[[ 1, 1, 1, 1],[ 1, 1, 1, 1],[ 1, 1, 1, 1]],[[ 1, 1, 1, 1],[ 1, 1, 1, 1],[ 1, 1, 1, 1]]], dtype=int16)>>> np.empty( (2,3) ) # uninitialized, output may varyarray([[ 3.73603959e-262, 6.02658058e-154, 6.55490914e-260],[ 5.30498948e-313, 3.14673309e-307, 1.00000000e+000]])⽣成均匀分布的array:arange(最⼩值,最⼤值,步长)(左闭右开)linspace(最⼩值,最⼤值,元素数量)>>> np.arange( 10, 30, 5 )array([10, 15, 20, 25])>>> np.arange( 0, 2, 0.3 ) # it accepts float argumentsarray([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])>>> np.linspace( 0, 2, 9 ) # 9 numbers from 0 to 2array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])>>> x = np.linspace( 0, 2*pi, 100 ) # useful to evaluate function at lots of points三.基本运算:整个array按顺序参与运算:>>> a = np.array( [20,30,40,50] )>>> b = np.arange( 4 )>>> barray([0, 1, 2, 3])>>> c = a-b>>> carray([20, 29, 38, 47])>>> b**2array([0, 1, 4, 9])>>> 10*np.sin(a)array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854])>>> a<35array([ True, True, False, False], dtype=bool)两个⼆维使⽤*符号仍然是按位置⼀对⼀相乘,如果想表⽰矩阵乘法,使⽤dot:>>> A = np.array( [[1,1],... [0,1]] )>>> B = np.array( [[2,0],... [3,4]] )>>> A*B # elementwise productarray([[2, 0],[0, 4]])>>> A.dot(B) # matrix productarray([[5, 4],[3, 4]])>>> np.dot(A, B) # another matrix productarray([[5, 4],[3, 4]])内置函数(min,max,sum),同时可以使⽤axis指定对哪⼀维进⾏操作:>>> b = np.arange(12).reshape(3,4)>>> barray([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])>>>>>> b.sum(axis=0) # sum of each columnarray([12, 15, 18, 21])>>>>>> b.min(axis=1) # min of each rowarray([0, 4, 8])>>>>>> b.cumsum(axis=1) # cumulative sum along each rowarray([[ 0, 1, 3, 6],[ 4, 9, 15, 22],[ 8, 17, 27, 38]])Numpy同时提供很多全局函数>>> B = np.arange(3)>>> Barray([0, 1, 2])>>> np.exp(B)array([ 1. , 2.71828183, 7.3890561 ])>>> np.sqrt(B)array([ 0. , 1. , 1.41421356])>>> C = np.array([2., -1., 4.])>>> np.add(B, C)array([ 2., 0., 6.])四.寻址,索引和遍历:⼀维数组的遍历语法和python list类似:>>> a = np.arange(10)**3>>> aarray([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729])>>> a[2]8>>> a[2:5]array([ 8, 27, 64])>>> a[:6:2] = -1000 # equivalent to a[0:6:2] = -1000; from start to position 6, exclusive, set every 2nd element to -1000 >>> aarray([-1000, 1, -1000, 27, -1000, 125, 216, 343, 512, 729])>>> a[ : :-1] # reversed aarray([ 729, 512, 343, 216, 125, -1000, 27, -1000, 1, -1000])>>> for i in a:... print(i**(1/3.))...nan1.0nan3.0nan5.06.07.08.09.0多维数组的访问通过给每⼀维指定⼀个索引,顺序是先⾼维再低维:>>> def f(x,y):... return 10*x+y...>>> b = np.fromfunction(f,(5,4),dtype=int)>>> barray([[ 0, 1, 2, 3],[10, 11, 12, 13],[20, 21, 22, 23],[30, 31, 32, 33],[40, 41, 42, 43]])>>> b[2,3]23>>> b[0:5, 1] # each row in the second column of barray([ 1, 11, 21, 31, 41])>>> b[ : ,1] # equivalent to the previous examplearray([ 1, 11, 21, 31, 41])>>> b[1:3, : ] # each column in the second and third row of barray([[10, 11, 12, 13],[20, 21, 22, 23]])When fewer indices are provided than the number of axes, the missing indices are considered complete slices: >>>>>> b[-1] # the last row. Equivalent to b[-1,:]array([40, 41, 42, 43])…符号表⽰将所有未指定索引的维度均赋为:,:在python中表⽰该维所有元素:>>> c = np.array( [[[ 0, 1, 2], # a 3D array (two stacked 2D arrays)... [ 10, 12, 13]],... [[100,101,102],... [110,112,113]]])>>> c.shape(2, 2, 3)>>> c[1,...] # same as c[1,:,:] or c[1]array([[100, 101, 102],[110, 112, 113]])>>> c[...,2] # same as c[:,:,2]array([[ 2, 13],[102, 113]])遍历:如果只想遍历整个array可以直接使⽤:>>> for row in b:... print(row)...[0 1 2 3][10 11 12 13][20 21 22 23][30 31 32 33][40 41 42 43]但是如果要对每个元素进⾏操作,就要使⽤flat属性,这是⼀个遍历整个数组的迭代器>>> for element in b.flat:... print(element)...12310111213202122233031323340414243。
python基础入门教程目录1.python 的基本概念2.字符串的相关操作3.列表、字典、组元的相关操作4.运算符的相关应用5.循环语句和条件语句的相关操作6.函数的应用7.了解数组的属性类型。
8.掌握有关数组的基本操作。
9.掌握 NumPy 矩阵与其通用函数。
1.输入与输出格式程序分析:●Print()是输出语句。
●可以使用str.format(填充的内容)进行填充。
2.输入结构操作程序分析:●利用input()语句,通过输入任意两个数。
●利用print()语句显示输入结果。
3.字符串有关操作(1)程序分析:●主要利用 + 、*等进行操作。
●可以通过len()语句获取字符串的长度。
4.列表的有关操作(1)创建列表程序分析:●利用列表名_list 创建列表,利用方括号[],列表一旦建立,可以进行添加,删除或者搜索的操作,可以是int也可以是str。
●利用*对列表进行复制,利用+对列表进行合并。
●extend()确定合并顺序5.字典的有关操作程序分析:●字典把键值和值联系起来,用dict={key1:value2,key2:value2…}创建字典。
6.for循环程序分析:●for循环是用来遍历任何序列的项目,这个序列可以是列表,也可以是一个字符串,针对这个序列的每个项目去执行相应的操作。
●for循环的格式: for 变量 in 序列:条件语句elif程序分析:●elif条件语句可以实现多条件分支。
●格式为:if判断条件1:●执行语句1● elif判断条件2:●执行语句2● else:●执行语句47.break 语句程序分析:●break语句用于终止循环,程序跳到循环外继续执行。
(2)while循环程序分析:●while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。
●while循环格式:while 判断条件:语句体6.函数程序分析:●Python提供了许多内建函数,比如print()。
如何用Python实现数据分析?一篇文章搞定!如何用Python实现数据分析?一篇文章搞定!Python已经成为了数据分析领域中非常流行的编程语言之一。
通过使用Python的各种数据分析库,我们可以方便地处理、分析和可视化数据。
本文将介绍Python的基本数据分析工具,以及如何在Python中进行数据分析。
1.Python数据分析基础Python是一种非常流行的编程语言,因为它易读易写、可扩展性强、可移植性好等特点,因此在数据分析领域中被广泛使用。
在Python中进行数据分析的基本工具包括NumPy、Pandas、Matplotlib、Seaborn和Scikit-learn。
1.1 NumPyNumPy是Python中用于数值计算的基本库,它支持高效的多维数组运算。
在NumPy 中,最基本的数据结构是数组。
NumPy数组是由同类型元素的集合组成的,可以是一维数组或多维数组。
NumPy的一维数组类似于Python的列表,而多维数组则类似于矩阵。
1.1.1 安装NumPy在使用NumPy之前,需要先安装它。
可以通过pip命令来安装NumPy,具体方法如下:pip install numpy1.1.2 创建数组在NumPy中,可以使用np.array()函数来创建数组。
以下是一些基本的创建数组的方法:ini Copy codeimport numpy as np# 创建一维数组a = np.array([1, 2, 3, 4, 5])print(a)# 创建二维数组b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])print(b)# 创建全0数组c = np.zeros((2, 3))print(c)# 创建全1数组d = np.on es((2, 3))print(d)1.1.3 数组运算NumPy支持多种数组运算,包括加、减、乘、除等。
以下是一些基本的数组运算方法:ini Copy codeimport numpy as npa = np.array([1, 2, 3])b = np.array([4, 5, 6])# 数组加法c = a + bprint(c)# 数组减法d = a - bprint(d)# 数组乘法e = a * bprint(e)# 数组除法f = a / bprint(f)1.2 PandasPandas是基于NumPy的数据处理库,提供了快速便捷的数据结构和数据分析工具。
python中np.array用法NumPy 是 Python 中最重要的科学计算库之一,主要用于高性能的多维数组和矩阵运算,数字图像处理和数据科学,比如统计处理,线性代数,和scikit learn等机器学习库等。
其中的np.array函数可以接受Python及元组的多种形式的序列,以创建多维NumPy数组。
1. 用法说明np.array()函数用于从给定的输入数据中创建NumPy数组。
它接受一个参数,即要转换为数组的任何序列,如列表,元组,字典等。
该函数返回创建的NumPy 数组。
2.语法numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)参数:object : 数组或嵌套的序列dtype : 数组元素的数据类型,可选copy : 对象是否需要复制,默认为trueorder : C(行方向的数组),F(列方向的数组)或A(任何方向的数组,默认)subok : 默认情况下,返回的数组被强制为基类数组。
如果为true,则返回子类ndmin : 指定返回数组的最小维数3.实例假设我们有一个列表:list1 = [1,3,5,7,9,11]使用np.array()将其转换为数组:array1 = np.array(list1)输出结果:array([ 1, 3, 5, 7, 9, 11])我们可以使用数组的属性来检查它的类型:print(array1.dtype)输出结果:int32np.array()也可以创建多维数组:list2 = [[1,2,3],[4,5,6],[7,8,9]]array2 = np.array(list2)print(array2.ndim)因此,np.array()是一个常用函数,用于将Python和元组的多种形式的序列转换为多维NumPy数组。
可以使用它来轻松实现复杂的数学操作。
python计算矩阵的秩代码_Numpy中对向量矩阵的使用详解在Python中,可以使用NumPy库来进行向量和矩阵的操作。
NumPy是一个开源的基于Python的科学计算库,可以用于数值计算、线性代数、矩阵运算等。
1. 导入NumPy库在开始之前,首先需要导入NumPy库。
可以通过下面的代码来导入:```pythonimport numpy as np```2.向量的创建和操作向量是一个有序集合,可以通过列表或NumPy数组来表示。
下面是创建向量的两种方式:```python#使用列表创建向量v1=[1,2,3,4,5]# 使用NumPy数组创建向量v2 = np.array([1, 2, 3, 4, 5])```向量的操作包括向量的加法、减法、乘法和除法等。
```python#向量的加法v3=v1+v2#向量的减法v4=v1-v2#向量的乘法(按元素相乘)v5=v1*v2#向量的除法(按元素相除)v6=v1/v2```3.矩阵的创建和操作矩阵是一个二维数组,可以通过列表的列表或NumPy数组来表示。
下面是创建矩阵的两种方式:```python#使用列表的列表创建矩阵m1=[[1,2,3],[4,5,6],[7,8,9]]# 使用NumPy数组创建矩阵m2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])```矩阵的操作包括矩阵的加法、减法、乘法和除法等。
```python#矩阵的加法m3=m1+m2#矩阵的减法m4=m1-m2#矩阵的乘法(按元素相乘)m5=m1*m2#矩阵的除法(按元素相除)m6=m1/m2#矩阵的乘法(矩阵乘法)m7 = np.dot(m1, m2)```4.计算矩阵的秩矩阵的秩表示矩阵的最大线性无关行数或列数。
可以使用NumPy库中的`np.linalg.matrix_rank(`函数来计算矩阵的秩。
```pythonrank = np.linalg.matrix_rank(m2)```在上面的代码中,`m2`是要计算秩的矩阵。
Python基础之Numpy的基本⽤法详解⽬录⼀、数据⽣成1.1 ⼿写数组1.2 序列数组1.3 随机数组1.4 其他⽅式数组⼆、数组属性查看三、数组索引3.1 ⼀维数组的索引3.2 ⼆维数组的索引四、数组的⽅法4.1 改变数组维度4.2 数组拼接4.3 数组分隔4.4 算术运算⼀、数据⽣成1.1 ⼿写数组a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) # ⼀维数组b = np.array([[1, 2], [3, 4]]) #⼆维数组1.2 序列数组numpy.arange(start, stop, step, dtype),start默认0,step默认1c = np.arange(0, 10, 1, dtype=int) # =np.arange(10) [0 1 2 3 4 5 6 7 8 9]d = np.array([np.arange(1, 3), np.arange(4, 6)]) # ⼆维数组# 不过为了避免⿇烦,通常序列⼆维数组都是通过reshape进⾏重新组织dd = c.reshape(2, 5) # 将⼀维数组重新组合成2⾏5列1.3 随机数组numpy.random.random(size=None) 该⽅法返回[0.0, 1.0)范围的随机⼩数。
numpy.random.randint() 该⽅法返回[low, high)范围的随机整数。
该⽅法有三个参数low、high、size 三个参数。
默认high是None,如果只有low,那范围就是[0,low)。
如果有high,范围就是[low,high)numpy.random.randn(d0,d1,…,dn) 该⽅法返回⼀个或⼀组样本,具有正态分布np.random.normal 指定期望和⽅差的正太分布e = np.random.random(size=2) # ⼀维数组,元素两个,[0.0,1.0]的随机数f = np.random.random(size=(2, 3)) # 两⾏三列数组,[0.0,1.0]的随机数h = np.random.randint(10, size=3) # [0,10]范围内的⼀⾏三列随机整数i = np.random.randint(5, 10, size=(2, 3)) # [5,10]范围内的2⾏3列随机整数1.4 其他⽅式数组numpy.zeros 创建指定⼤⼩的数组,数组元素以0 来填充numpy.ones 创建指定形状的数组,数组元素以1 来填充numpy.empty 创建⼀个指定形状(shape)、数据类型(dtype)且未初始化的数组,⾥⾯的元素的值是之前内存的值np.linspace 创建⼀个⼀维数组,数组是⼀个等差数列构成的numpy.logspace 创建⼀个于等⽐数j = np.zeros((2, 5))k = np.ones((2, 5))l = np.linspace(1, 20, 10)⼆、数组属性查看ndarray.ndimdarray.shape 数组的维度和列,对于矩阵,n ⾏m 列ndarray.size 数组元素的总个数,相当于.shape 中n*m 的值ndarray.dtype ndarray 对象的元素类型ndarray.itemsize ndarray 对象中每个元素的⼤⼩,以字节为单位ndarray.flags ndarray 对象的内存信息ndarray.real ndarray 元素的实部ndarray.imag ndarray 元素的虚部ndarray.data 包含实际数组元素的缓冲区,由于⼀般通过数组的索引获取元素,所以通常不需要使⽤这个属性。
12 函数的参数在《音响技术》第7期“函数”的学习中最后讲到了一个自动转发电子邮件的Python脚本mail(a),其中的(a)就是自定义函数mail的一个参数,函数的参数可以是多个,用逗号隔开。
函数在调用参数时会依次接收。
例如在日常的NION推广活动中,会演示一些NWare 的软件功能,软件的控制特性在Emulated模式下基本上是可以实现的,但是没有连接NION主机的情况下,音频通道的通路没有电平显示,整体的演示功能就没有那么好看,如在此做一个电平显示的模拟程序,可以让一个纯软件的NWare看起来比较美观,如图1。
这个小程序的功能就是使用一个随机函数发生器,产生一个随机的数字推动电平表显示。
左边的两个旋钮分别是设置这个随机数字发生器的最大值和最小值。
脚本为:import random #导入随机函数模块def meter(min,max): #定义一个函数meter包含 两个控制参数 min=inputs[0].value_get() #最小值和最大值从输入旋 钮提取 max=inputs[1].value_get() a=random.randrange(min,max) #给定范围内产生一个随机数 return a #将这个随机数返回并输出while 1: event.wait(200) #电平表的更新速度 d=meter(min,max) #导入函数meter,并输出 outputs[0].string_set(d)这个函数包含了两个参数min和max,分别代表了random模块要求的随机参数最小量和最大量。
脚本里面的循环片段添加的event.wait(200),表示每次重复电平循环时,中间暂停200 ms,一方面可以让电平表输出跳动不会太剧烈,更主要的是可以减少很多的数据量。
当作这种循环的时候,要把脚本程序设定到多线程模式下,方法是图1右键的Random_full模块选择Device Properties 并勾选threaded选项,此时才能完成event.wait()功能。
这个脚本只是告诉大家如何去使用函数的参数设定功能。
如果参数设定得正确,那么脚本就可以稳定地运行起来。
但是如果出现意外情况,Python解释器可能无法解释参数的特性,导致程序终止。
例如当输入的最小随机变量min参数比最大随机变量max还要大时,random模块将无法做出判断,从而产生异常;另外一种情况就是random模块只能接受整数类型的参数,如果输入了小数类型(浮点数据),那么python 解释器同样会产生异常并停止运行。
因此在设定min 和max参数时要格外小心,不能出现以上两种情况,否则就要重新编译文件运行。
任何编程语言在运行的过程中都可能会出现异常,那么对异常数据的处理就显得非常必要了。
在C解析媒体矩阵(MediaMatrix)(四十九)NWare软件应用(11)——Python编程基础(续5)图1 用脚本编写一个电平表模拟程序语言中,头文件可以设定包含可捕获的错误数,但是一般都是用在多层的if或者switch语句中;C++虽然支持异常系统,但是很多的应用并不充分。
包括C/C++在内的很多的语言都没有很好的方法用于执行捕获单独语句的执行错误。
但是Python却提供了一种不同的方法,在发生错误的时候会引发异常,并可以使用内置语句引发并捕获异常,从而安全地处理。
下面就仔细研究一下有关异常的捕获问题。
13 异常与异常捕获异常(Exception)是一种特殊的Python对象,它可以向模块调用者传递调用信息失败。
异常发生后还可以捕获该异常,异常信息则传递到异常处理器中。
和C语言所不同的是,Python可以获得问题的准确描述,甚至可以获得已发生错误的额外信息。
对于图1所示的例子,如果将左侧旋钮旋转出一个非整数的小数时,那么Python就会停止运行,并产生异常。
可以在Random_full脚本框的错误提示框Error中看到如下字样:ValueError: non-integer arg 1 for randrange()这表示在“randrange()”方法中引入了一个非整数的数值参数错误,这种报错称为异常,冒号前面的“ValueError:”称为异常的类型。
通常来说如果解释器发生异常,那么它就会停止运行。
对异常进行捕获的目的就是要“通知”Python解释器,如果发生了异常,则按照另外一种方式去解决这个问题,而不要终止解释器。
增加了异常捕获的脚本程序如下:import random #导入random模块def meter(min,max): #定义函数meter() min=inputs[0].value_get() #写入参数 max=inputs[1].value_get() if max > min: #只有当最大值大于最 小值的时候 try: #异常捕获 a=random.randrange(min,max) #设定范围产生随机数a except ValueError: #设定需要捕获的异常 类型 min=int(min) #出现异常时小数取整 max=int(max) return random.randrange(min,max) #重新生成随机数a else: #若没有出现异常 return a #则不处理返回随机数a else: #如果max参数不比min大的话,则输出以下信息 message.string_set('The Max parameter must be more than Min') return -100 #返回-100的意思就是要电平表到最小值while 1: event.wait(200) d=meter(min,max) outputs[0].string_set(d)一般来说,用于处理异常的try语句,有两种不同的形式:try……except……else 和 try……finally。
第一种形式上面已经举例,如果只是跟踪异常而不作任何的处理,那么就使用第二种形式更为简洁。
先总结一下最常用的第一种异常捕获形式:try: BLOCKexcept [EXCEPTION [,DATA……]]: BLOCKelse: BLOCK上述异常捕获的格式是一种固定的模式,正常运行的时候,当Python解释器遇到try则表示进入异常捕获状态,执行以下操作。
(1)首先执行try下面的BLOCK语句块,如果引发解释器的异常,则执行过程立刻转移到except语句进行异常类型匹配。
(2)如果上述异常和指定的EXCEPTION匹配(如果这里没有定义任何的EXCEPTION,表示通用异常,也就是任何异常都适用),则执行对应的BLOCK语句块,DATA也是一个可选参数,这种异常返回不常用。
上例中指定的EXCEPTION异常是:ValueError,所以当输入一个小数时,Python解释器返回了ValueError 异常,此时就会运行下面的语句块,也就是把输入的小数转换成整数类型,并返回输出给函数。
(3)如果所引发的异常不匹配,那么执行下一个except语句。
也就是说异常的匹配条件except语句可以任意多的。
(4)如果任何一个except语句都没有匹配的话,那么这个异常会被传递到高层的try代码块中,要注意,此时的异常并没有解决,而是完整的传递过去。
(5)若没有发生任何异常,则执行else代码块。
上述的5个执行步骤还有几点需要额外注意。
一是当except匹配一个异常时使用except ValueError:这样的格式,当一个except同时需要匹配多个异常类型时,要用添加括号来表示,例如except (ValueError,TypeError):第二个需要注意的是,Python是按照先后顺序去检查except以确定异常的匹配问题,这个检查是按照先后的顺序的。
Python不会一次检查所有的except句子,这就意味着可能一些except根本就没有检查就已经返回调用了。
第三个要注意的是,在一次运行Python的过程中,异常处理器只运行一次,try……except……else语句只允许匹配一次,一旦执行过一次异常代码块,则整个异常的捕获完成,程序回到try语句块后面的语句中。
再说一下第二种异常捕获形式:try: BLOCKfinally: BLOCK执行try……finally语句的规则如下。
(1)执行try BLOCK中的语句。
(2)如果发生异常,则该异常传递到下级之前,执行finally BLOCK。
(3)如果没有发生异常,则执行finally BLOCK,直到try语句结束。
从这个规则可以看出,不论是不是发生异常,它的执行顺序都是一样的。
在一些例子中,如果只是运行一段代码,而无论是不是有异常产生都要按照相同的结果输出,那么try……finally这个句子就非常有用。
例如,通过NION主机登陆远程服务器进行通信时,需要定时去捕获错误,这样做的目的是确保线路畅通,以便在真正需要通信的时候使用。
由于平时这个动作只是去探查线路的健康状态,而并没有需要进行通信,所以无论线路是否健康,都要关闭这个通道的通信,那么这个异常的捕获过程为:try: remote.send_data(destination,datastream)finally: remote.close_connection()这样就做到了无论通信链路是否有正确响应,都要关闭这个通道。
但是try……finally语句并没有真正处理这个异常,也就是说如果通信链路的返回信息出现异常,它是无法进一步处理的。
但是这个异常并没有消失,而是自动传递到下一级,因此可以使用try语句的嵌套结构去捕获这个异常,并做出响应的动作,代码如下:try: try: remote.send_data(destination,datastream) finally: remote.close_connection()except NetworkError,errorstr: message.string_set(“Error: Couldn’t send connection data,”errorstr)else: message.string_set(“Connection successful”)这个例子一方面了解了try语句的嵌套方法,另一方面了解了try……finally语句结构的用法。
如果try捕获到了异常,说明网络通信有一些问题,Python会报出网络返回错误“NetworkError”,同时从系统接口程序获得了此次通信的错误代码“errorstr”,并将这个代码粘贴在NWare的信息窗口。
这里的错误代码就是开始探讨try……except……else语句结构时,里面包含的可选参数[,DATA……]一类的选项。