编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN
Python语言的支持者开发了多种用于科学计算的软件包,用于实现一些昂贵的商业科学计算软件才能实现的一些计算功能,常用的有NumPy和SciPy等。 NumPy是一个开源的科学计算基础程序包,提供了多维数组和基本数学运算功能。NumPy的底层代码是使用C语言写成的,效率优于Python代码,且更简洁。
1. NumPy数组:
NumPy使用ndarray对象来处理多维数组,其存储效率和输入输出性能优于Python嵌套列表。通常,NumPy数组中的所有元素的类型都是相同的,便于科学计算中的大量数值计算。
1)索引和切片:
NumPy数组也可以索引和切片,也可以使用负索引。NumPy中的数组切片是原始数组的视图,对其中数据的修改会反映到源数组上。
切片可以用于多维数组,假设x2d是一个6x3的数组,x2d[1]等价于x2d[1,:],都表示数组的第二行;x2d[:,1]表示数组的第二列;x2d[::2, 1]可以选中数组的第二列的每三个元素。
省略号可以用来替换零个或多个冒号,以匹配切片对象的所有维度,这个维度必须和原始数组的维度相等。如果x4d是一个5x6x7x8的数组,那么x4d[2:, ..., 6]等价于x4d[2:,:,:,6];同样,x4d[..., 4]等价于x4d[:,:,:,4]。示例:
nar3=numpy.array([[[1,2],[3,4]],[[5,6],[7,8]]])
nar3[1] # array([[5,6],[7,8]])
nar3[1]=99
nar3 # array([[[1,2],[3,4]],[[99,99],[99,99]]])
也可以在切片中利用冒号选取低维度的整个轴,然后对高纬度进行切片。示例:
nar3[:,1] # array([[3,4],[7,8]])
nar3[:,:,0] # array([1,3],[5,7]])
2)数组对象的属性:
·ndim:表示数组轴的个数。NumPy中维度称为轴axis,轴的个数称为轶rank
·shape:指示数组在每个维度上大小的整数元组
·size:为数组元素的总个数,等于shape属性中元组元素的乘积
·dtype:描述数组中元素类型的对象
·itemsize:表示数组中每个元素所占字节的大小
示例:
nar3.ndim # 3
nar3.shape # (2,2,2)
nar3.size # 8
nar3.stype # dtype('int32')
nar3.itemsize # 4
ndarray数组也可以使用方括号中的索引来访问,也能使用切片,切片结构start:stop:step。
2. NumPy数据类型:
NumPy可以在数据类型的后面加上数字,标识这种类型在内存中占的位数,相当于提供了更多的数据类型。
类型名 |
描述 |
bool |
用一个bit存储的布尔类型 |
inti |
由所在平台决定其所占位数的整数,一般为int32或int64 |
int8 |
一个字节大小,-128~137 |
int16 |
整数,-32768~32767 |
int32 |
整数, |
int64 |
整数, |
uint8 |
无符号整数,0~255 |
uint16 |
无符号整数,0~65535 |
uint32 |
无符号整数, |
uint64 |
无符号整数, |
float16 |
半精度浮点数,16位,正负号1位,指数5位,尾数10位 |
float32 |
单精度浮点数,32位,正负号1位,指数8位,尾数23位 |
float64或float |
双精度浮点数,64位,正负号1位,指数11位,尾数52位 |
complex64 |
复数,分别用两个32位浮点数表示实部和虚部 |
complex128或complex |
复数,分别用两个64位浮点数表示实部和虚部 |
3. NumPy的类型转换函数:
类型转换函数将数字转换为相应类型,函数名与类型名相同。示例:
import numpy
numpy.bool(6)
numpy.int8(True)
numpy.uint8(-122)
numpy.float64(-122)
numpy.complex64(64)
NumPy中,多数函数允许使用指定数据类型的参数,通常这个参数是可选的,指定格式为dtype=类型名,示例:
a=numpy.arange(5,dtye=int)
a=numpy.arange(5,dtye=float)
a=numpy.arange(5,dtye=complex)
NumPy中也可以使用dtype函数根据标准数据类型自定义数据类型,一般存储不同对象的多项数据。示例:
st=numpy.dtype([('code', str, 10),('name', str, 10),('price', float)])
4. NumPy数组操作:
1)创建数组:
NumPy支持多种创建数组的函数。
函数 |
作用 |
Array |
可将一切序列型对象转换为ndarray对象,可显式指定dtype,否则自动推断一个合适的数据类型 |
arrange(N) |
创建一个有N个元素的列表,取值分别为0~N-1的整数 |
ones() |
根据指定的维数和类型创建一个全1的数组 |
zeros() |
根据指定的维数和类型创建一个全0的数组 |
eye(N) |
创建一个正方的N*N单位矩阵,对角线为1,其余为0 |
empty |
根据指定的维数和类型创建一个数组但不填充任何值,里面为垃圾值 |
使用以上函数创建数组时,如果没有显式地指明类型,则数据类型基本都是float64。示例:
numpy.array([[1,2],[3,4]])
numpy.array([[1,2],[3,4]], dtype=float)
numpy.arange(5) # array([0,1,2,3,4])
numpy.ones(2,3) # array([[1.,1.,1.],[1.,1.,1.]])
numpy.ones((2,3), dtype=int) # array([[1,1,1],[1,1,1]])
numpy.zeros(4) # array([0.,0.,0.,0.])
numpy.eye(2) # array([[1.,0.],[0.,1.]])
2)数组和标量之间的运算:
使用NumPy中的ndarray对象,不必编写循环就可以对数据执行批量运算。示例:
a=numpy.array([[1,2],[3,4]])
a+2 # array([[3,4],[5,6]])
a*2 # array([[2,4],[6,8]])
a**2 # array([[1,4],[9,16]])
3)数组的转置:
NumPy中使用transpose方法实现数组的转置,也可以使用T属性访问转置矩阵。示例:
a.transpose() # array([[1,3],[2,4]])
a.T # array([[1,3],[2,4]])
对于高维数组,调用transpose()时,可以使用元组指定如何对这些轴进行转置。示例:
nar3=numpy.array([[[1,2],[3,4]],[[5,6],[7,8]]])
nar3.transpose() # array([[[1,5],[3,7]],[[2,6],[4,8]]])
nar3.transpose((1,2,0)) # array([[[1,5],[2,6]],[[3,7],[4,8]]])
示例中将第1维转置为第0维,第2维转置为第1维,第0维转置为第2维。
5. 数组的变形和转换:
实现数组变形,使用ravel、reshape、resize和指定数组维度属性的方法。ravel方法将数组展开为一维数组。示例:
x2d.ravel()
x2d.reshape(6,3)
x2s.resize((3,6))
x2d,shape=(9,2)
a=numpy.arange(12).reshape(3,4) # array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
r=a.cumsum() # array([0,1,3,6,10,15,21,28,36,45,55,66])
r=numpy.cumsum(a) # array([0,1,3,6,10,15,21,28,36,45,55,66])
6. 通用函数ufunc:
通用函数是对ndarray进行一个元素一个元素操作的函数,也支持广播、类型转换和其他一些特征。NumPy中,广播是对不同维度数组操作的过程,特别在数学运算中,较小维度的数组要在大维度的数组中广播,以使其维度和大维度数组兼容。
1)通用函数的属性:
每个通用函数都有一些属性,包含函数的信息,但不能进行设置。
·__doc__:包含了ufunc函数的doc字符串
·__name__:ufunc的名称
·ufunc.nin:表示总的输入数量
·ufunc.nout:表示总的输出数量
·ufunc.nargs:表示总的变量数,包括输入 和输出数量
·ufunc.ntypes:表示这个函数定义的类型的种类
·ufunc.types:返回函数定义的ntypes具体类型的列表
·ufunc.identity:表示这个函数的值
2)通用函数的方法:
所有的通用函数都有5中方法,前4种方法包含两个输入变量,返回一个输出变量;第5种允许使用索引做位置操作。
·ufunc.reduce:这一个坐标轴应用通用函数时,可以将数组降低一个维度
·ufunc.accumulate:可以在对所有元素使用同一个运算符时累积结果
·ufunc.reduceat:可以在单个坐标轴上减少指定的切片
·ufunc.outer(A, b):对所有(a,b)应用通用函数操作符,其中a包含于A,b包含于B
·ufunc.at:对特定元素执行未缓存的位置操作
3)常用的通用函数:
NumPy支持超过60种通用函数,包括四则运算、开方、幂指数、指数运算、三角函数、比特位运算、比较和浮点运算等。对数组执行元素级运算,并得到一个数组。比使用循环更高效。常用函数有:
函数 |
描述 |
abs(a)、fabs(a) |
求各元素绝对值,fabs()速度快,但不能对复数数组使用 |
ceil(a) |
求大于或等于各元素的最小整数 |
floor(a) |
求小于各元素的最大整数 |
rint(a) |
将各元素四舍五入得到整数 |
modf(a) |
将数组的整数和小数部分以两个独立数组的形式返回 |
exp(a) |
求各元素的以e为底的指数函数 |
log(a)、log10(a)、log2(a) |
分别求各元素的以e、10、2为底的对数 |
log1p(a) |
求各元素加1后的自然对数 |
sqrt(a) |
求各元素的平方根 |
square(a) |
求各元素的平方 |
isnan(a) |
返回一个布尔型数组,判断各元素值是不是NaN |
isfinite(a) |
返回一个布尔型数组,判断各元素值是不是有穷的 |
isinf(a) |
返回一个布尔型数组,判断各元素值是不是无穷的 |
cos(a)、sin(a)、tan(a) |
求各元素的三角函数 |
cosh(a)、sinh(a)、tanh(a) |
求各元素的双曲函数 |
add(a,b) |
将数组a、b中的对应元素相加 |
subtract(a,b) |
将数组a、b中的对应元素相减 |
multyply(a,b) |
将数组a、b中的对应元素相乘 |
divide(a,b)、floor_divide(a,b) |
将数组a中的元素除或地板除b数组中的对应元素 |
power(a,b) |
以a数组元素为底,b数组相应元素为幂求指数 |
maximum(a,b)、fmax(a,b) |
求a、b相应元素的最大值,fmax将忽略NaN |
minimum(a,b)、fmin(a,b) |
求a、b相应元素的最小值,fmin将忽略NaN |
mod(a,b) |
用数组a中的元素对数组b中的对应元素求余数 |
copysign(a,b) |
将b数组元素的正负号复制给a数组的相应元素 |
greater(a,b)、greater_equal(a,b) |
比较数组a和b的对应元素,并最终产生布尔型数组 |
less(a,b)、less_equal(a,b) |
比较数组a和b的对应元素,并最终产生布尔型数组 |
equal(a,b)、not_equal(a,b) |
比较数组a和b的对应元素,并最终产生布尔型数组 |
logical_end(a,b)、logical_or(a,b)、logical_xor(a,b) |
对数组a和b的对应元素进行逻辑与、或、异或运算,并最终产生布尔型数组 |
right_shift(x_bit,1) |
位操作右移 |
left_shift(x_bit,1) |
位操作左移 |
7. 统计方法:
NumPy可以方便地调用统计函数对整个数组或某个轴向的数据进行统计计算。常用函数有:
方法 |
描述 |
max、min |
求最大值或最小值 |
sum |
求数组中所有元素或某轴向元素的和 |
mean |
求数组元素的算术平均值,零长度的数组的算术平均值为NaN |
std |
求数组元素的标准差,自由度可调 |
var |
求数组元素的方差,自由度可调 |
argmax、argmin |
求最大元素或最小元素的索引 |
cumsum |
求所有元素的累计和 |
cumprod |
求所有元素的累计积 |
示例:
import numpy as np
x=np.random.randn(10)
x2=np.array(((1,2,3),(1,2,3),(1,2,3)))
print(x)
mean=x.mean()
print(mean)
std=x.std()
print(std)
var=x.var()
print(var)
8. 集合运算:
NumPy提供了对一维数组进行基本集合运算的函数。
方法 |
描述 |
unique(a) |
删除数组中的重复元素,并返回唯一元素的有序结果 |
intersect1d(a,b) |
查找a和b中的公共元素,并返回公共元素的有序结果 |
union1d(a,b) |
求a和b的并集,并返回有序结果 |
in1d(a,b) |
返回一个布尔型数组,如果a元素包含于b,元素值为True,否则False |
setdiff1d(a,b) |
求集合a和b的差,即存在于a中但不存在于b中的元素 |
setxor1d(a,b) |
求集合a和b的对称差,即存在于a或b中,但不同时存在于a、b中 |
示例:
a=numpy.array([2,3,7,4,3,9,3,5,2,7,9])
b=numpy.array([7,8,6,0,3,2,1,7,8,3,6,3,9,8])
numpy.unique(a) # a=numpy.array([2,3,4,5,7,9])
numpy.intersect1d(a,b) # a=numpy.array([2,3,7,9])
numpy.union1d(a,b) # a=numpy.array([0,1,2,3,4,5,6,7,8,9])
numpy.setdiff1d(a,b) # a=numpy.array([4,5])
numpy.setxor1d(a,b) # a=numpy.array([0,1,4,5,6,8])
9. 排序:
NumPy中的数组可以使用sort排序,并且多维数组可以在任意轴上排序。示例:
t=numpy.random.rand(4)
t.sort()
a=numpy.random.rand(4)
numpy.sort(b)
可见,sort()既可以作为函数使用,也可以作为数组的方法使用。作为函数使用时,返回的是数组已排序的副本,数组本身不受影响;作为数组方法使用时,会改变数组本身。
10. 数学模块:
NumPy加入了特定功能模块,如线性代数、离散傅里叶变换、随机采样和矩阵代数库。
·numpy.linalg:支持各种线性代数功能,如数组和向量内积、外积和点积,向量和矩阵的范数,线性矩阵方程的解,矩阵的转置等。
·numpy.fft:可以计算离散傅里叶变换,包括一维、二维、多维
·numpy.matlib:包括默认返回矩阵对象而不是ndarray对象的函数,包括empty、zeros、ones、eye、rapmat、rand、randn、bmat、mat和matrix
·numpy.random:执行随机抽样的函数,支持随机排列组合的生成,还支持各种基于统计分布生成的随机抽样数值的函数
1)线性代数:
NumPy支持常用的线性代数函数:
函数 |
描述 |
diag |
求矩阵的对角线元素,可用参数k指定求哪一条线上的元素 |
dot |
完成矩阵乘法 |
trace |
计算对角线元素的和 |
而NumPy的linalg模块支持常见的线性代数操作,如求矩阵的逆、矩阵乘法、QR分解等。
函数 |
描述 |
det |
求矩阵的行列式 |
eig |
求矩阵的特征值和特征向量 |
inv |
求矩阵的逆 |
pinv |
求矩阵的Moore-Penrose伪逆 |
qr |
求QR分解 |
svd |
求矩阵的奇异值分解 |
solve |
求解线性方程组Ax=b,其中A为一个方阵 |
lstsq |
求解线性方程组Ax=b的最小二乘解 |
示例:
import numpy as np
from numpy import linalg as LA
arr2d=np.array(((100,200,300),(111,222,333),(129,461,795)))
eig_val,eig_vec=LA.eig(arr2d)
print(LA.norm(arr2d))
print(LA.det(arr2d))
print(LA.inv(arr2d))
arr1=np.array([[2,3],[3,4]])
arr2=np.array([4,5])
results=np.linalg.solve(arr1,arr2)
print(results)
results2=np.allclose(np.dot(arr1,results), arr2)
print(results2)
2)随机数
NumPy模块对Python中的random模块进行了扩展,增加了生成多种概率分布的样本值的函数,可以一次产生大量随机数。
方法 |
描述 |
seed |
确定随机数生成器的种子 |
rand |
产生均匀分布的随机数 |
randint |
产生给定上下限范围内的随机整数 |
randn |
产生满足正态分布的随机数,平均值为0,标准差为1 |
normal |
产生正态分布的随机数 |
uniform |
产生在上下限间均匀分布的随机数,上下限如果省略,则为[0,1) |
示例:
t1=numpy.random.rand(4)
t2=numpy.random.randint(3,9,10) # [3,9)间的10个随机数,结果array([7,3,4,7,8,8,4,5,6,5])
t3=numpy.random.uniform(0,9,size=(2,3))
t4=numpy.random.permutation(10)
t5=numpy.random.chisquare(5,10)
alpha,location_param=4.,2.
s1=numpy.random.pareto(alpha,10)+location_param
mean,std_deviation=4.,2.
s2=numpy.random.lognormal(mean,std_deviation,10)
11. 与数组相关的类:
这些类与ndarray类相关,目的地为了支持特定的增强功能。
1)矩阵子类matrix:
matrix类是ndarray的子类。一个矩阵能够通过其他矩阵或字符串生成,也能通过可以转化为ndarray的对象生成。matrix有特殊的运算符,*是矩阵的乘,**是矩阵的幂。matrix类提供的一些函数可以实现多种功能,如元素排序、转置计算、矩阵元素求和、将矩阵转换为列或其他数据类型。示例:
import numpy as np
a=np.matrix('1 2 3;4 5 6;7 8 9')
b=np.matrix('4 5 6;7 8 9;10 11 12')
print(a*b)
2)掩码数组:
NumPy有一个生成掩码数组的模块numpy.ma。掩码数组有两个组成部分,原始ndarray和一个掩码,掩码是由布尔逻辑值组成的数组,可用来判定数组的值有效或无效。掩码中的一个true值反映了数组中相应的值是无效的,掩码数组的计算中无效的实体将不会用到。
import numpy as np
import numpy.ma as ma
x=np.array([72,79,85,90,150,-135,120,-10,60,100])
mx=ma.masked_array(x,mask=[0,0,0,0,0,1,0,1,0,0])
mx2=ma.masked_array(x,mask=x<0)
print(x.mean())
print(mx.mean())
print(mx2.mean())
3)结构化数组:
ndarray能包含记录类型的值,为了生成一个记录类型的数组,首先需要生成记录类型的数据类型,然后用这种数据类型的元素构成数组。这种数据类型可以通过dtype在数组定义中定义。示例:
import numpy as np
rectype=np.dtype({'names':['mintemp','maxtemp','avgtemp','city'], 'formats':['i4','i4','f4','a30']})
a=np.array([(10,44,25.2,'Indore'),(10,42,25.2,'Mumbai'),(2,48,30,'Delhi')],dtype=rectype)
print(a[0])
print(a['mintemp'])
print(a['maxtemp'])
print(a['avgtemp'])
print(a['city'])
12. 访问文件:
⑴将数组以二进制方式存取:
使用save()函数可用方便地将数组存为扩展名为.npy的二进制文件。示例:
numpy.save('d:\\nshz',a) # a为一个数组
⑵读取保存数组数据的二进制文件。示例:
c=numpy.load('d:\\nshz.npy')
若没有指定扩展名,默认为.npy。
⑶存取文本文件:
NumPy使用savetxt()和loadtxt()函数存储文本数据。示例:
numpy.savetxt('d:\\npshz.txt',a,delimiter=',')
b=numpy.loadtxt('d:\\npshz.txt',delimiter=',')