语法格式:
numpy.array(object, dtype = None, copy = True, order = None, ndmin = 0)
参数说明:
通常情况下,结构化数据使用字段的形式来描述某个对象的特征。以下示例描述一位老师的姓名、年龄、工资的特征,该结构化数据其包含以下字段:
定义过程如下:
teacher = np.dtype([('name','S20'),('age','i1'),('salary','f4')])
#输出结构化数据
print(teacher)
#将其应用于ndarray对象
a = np.array([('ycs','32','6357.50'),('hga','43','6856.80'),('jh','33','8376.30')],dtype = teacher)
print(a)
输出结果:
[(‘name’,‘s20’),(‘age’,‘i1’),(‘salary’,’
[(b’ycs’, 32, 6357.5) (b’hga’, 43, 6856.8) (b’jh’, 33, 8376.3)]
其中字符串前加b是**把字符串变成bytes格式。python3默认的字符串格式是unicode,bytes是python2的str格式。
ndarray.ndim() 返回的是数组的维数
示例如下:
c = np.arange(24) #随机生成一个一维数组
print(c)
print(c.ndim)
输出为:
1
ndarray.itemsize()
返回数组中每个元素的大小(以字节为单位)
#数据类型为int64,代表8字节
x = np.array([1,2,3,4],dtype=np.int64)
print(x.itemsize)
输出为:
8
创建未初始化的数组,可以指定创建数组的形状(shape)和数据类型(dtype)以及数组元素在计算机内存中的储存顺序,默认顺序是“C”,即行优先顺序。语法格式如下:
numpy.empty(shape, dtype = float, order = 'C')
返回指定形状大小与数据类型的新数组,并且新数组中每项元素均用1填充,语法格式如下:
numpy.ones(shape, dtype = None, order = 'C')
举例:
arr1=np.ones((3,2),dtype=int)
print(arr1)
得到结果:
[[1 1]
[1 1]
[1 1]]
能将一个Python序列转换为ndarray对象,语法如下:
numpy.asarray(sequence, dtype = None, order = None)
其中sequence接受一个Python序列,可以是列表或者元组,举例:
I = [1,2,3,4,5,6,7]
print(I)
a = np.asarray(I)
print(type(a))
print(a)
结果:
[1,2,3,4,5,6,7]
[1 2 3 4 5 6 7]
表示使用指定的缓冲区创建数组,语法:
numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)
其中
把迭代对象转换为ndarray数组,其返回值是一个一维数组,语法:
numpy.fromiter(iterable, dtype, count = -1)
举例,使用内置函数range()创建列表对象,然后使用迭代器创建ndarray对象,代码如下:
list=range(6)
print(list)
#生成可迭代对象i
i = iter(list)
print(i)
#使用i迭代器,通过fromiter方法创建ndarray
array = np.fromiter(i,dtype=float)
print(array)
结果:
(0,6)
[0. 1. 2. 3. 4. 5.]
创建给定数值范围的数组,语法:
numpy.arange(start, stop, step, dtype)
例:
a = numpy.arange(1,10,2)
print(a)
结果:
[1 3 5 7 9]
在指定数值区间内,返回均匀间隔的一维等差数组,默认均分50份,语法:
numpy.linspace(start, stop, num = 50, endpoint = True, retstep = False, dtype = None)
其中:
a = numpy.linspace(0, 50, num = 6)
print(a)
创建等比数组,语法:
numpy.logspace(start, stop, num = 50, endpoint = True, base = 10.0, dtype = None)
其中:
a = numpy.logspace(1, 2, num = 10, endpoint = True, dtype = float)
print(a)
结果:
[ 10. 12.91549665 16.68100537 21.5443469 27.82559402
35.93813664 46.41588834 59.94842503 77.42636827 100. ]
NumPy常用的索引方式有两种:基本切片与高级索引。
内置slice()函数
语法:slice(start,stop,step)
例:
a = np.arange(-1,11,1)
print(a)
#生成切片对象
s = slice(2,9,3) #不包括右边界
print(a[s])
结果:
[-1 0 1 2 3 4 5 6 7 8 9 10]
[1 4 7]
冒号切片
[3]
就会返回2。[:9]
,则只会返回-1-7的所有数字,不包含第九个数。[2:]
则会返回第三个数到最后一个数。[2:9]
则会返回第三个数到第九个数,即对两个索引值之间的所有元素进行切片,但不包括停止索引。例:
a = np.array([[1,2,3],[3,4,5],[5,6,7]])
print(a)
print(a[...,1]) #返回第二列
print(a[...,1:]) #返回第二列及其之后的列
print(a[1,...]) #返回第二行
print(a[1]) #返回第二行
结果:
[[1 2 3]
[3 4 5]
[5 6 7]]
[2 4 6]
[[2 3]
[4 5]
[6 7]]
[3 4 5]
[3 4 5]
例1
x = np.ndarray([[1,2],[3,4],[5,6]])
y = x[[0,1,2][0,1,0]]
print(y)
得到位于(0,0)、(1,1)和(2,0)的数
结果:
> [1 4 5]
例2
获取4*3数组的四个顶点元素,对应的行索引为[0,0]和[3,3],列索引为[0,2]和[0,2]
b = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
print(b)
r = np.array([[0,0],[3,3]])
c = np.array([[0,2],[0,2]])
d = b[r,c]
print(d)
输出结果为
[[ 1 3]
[10 12]]
a = np.array([np.nan, 1+2j,2,np.nan,3,4,5])
print(a[~np.isnan(a)]) #去除非数字元素
print(a[np.iscomplex(a)]) #去除整数元素
结果:
[1.+2.j 2.+0.j 3.+0.j 4.+0.j 5.+0.j]
[1.+2.j]
NumPy中的广播机制(Broadcast)旨在解决不同形状数组之间的算术运算问题。
当两个数组形状不同,NumPy会自动触发广播机制。
可以配合for循环完成对数组元素的遍历。
例:
a = np.arange(0,60,5)
a = a.reshape(3,4)
for x in np.nditer(a):
print(x)
结果:
0 5 10 15 20 25 30 35 40 45 50 55
在内存中,Numpy数组提供了两种存储数据的方式,分别是C-order(行优先顺序)和fortrant-order(列优先顺序)。
遍历数组和遍历数组的转置顺序是一样的,即它们在内存中的存储顺序是一样的。
可以C样式遍历数组的转置得到与遍历数组不同顺序的结果。例:
a = np.arange(0,60,5)
a = a.reshape(3,4)
for x in np.nditer(a):
print(x)
for x in np.nditer(a.T):
print(x)
for x in np.nditer(a.T.copy(order='C')):
print(x)
得到结果分别为:
0 5 10 15 20 25 30 35 40 45 50 55
0 5 10 15 20 25 30 35 40 45 50 55
0 20 40 5 25 45 10 30 50 15 35 55
上述结果的原因为它们在内存中的存储方式不同
可以通过nditer对象的order
参数来指定数组的遍历的顺序。
for x in np.nditer(a, order = 'C'):
print(x)
for x in np.nditer(a, order = 'F'):
print(x)
得到结果:
0 5 10 15 20 25 30 35 40 45 50 55
0 20 40 5 25 45 10 30 50 15 35 55
nditer对象提供了一个可选参数op_flags
,它表示能否在遍历数组时对元素进行修改。提供了三种模式:
for x in np.nditer(a, op_flags=['readwrite']):
x[...]=2*x
print(a)
结果:
0 40 80 10 50 90 20 60 100 30 70 110
函数名称 | 函数介绍 |
---|---|
reshape | 在不改变数组元素的条件下,修改数组的形状。 |
flat | 返回一个迭代器,可以用for循环遍历其中的每一个元素。 |
flatten | 以一维数组的形式返回一份数组的副本,对副本的操作不会影响到原数组。 |
ravel | 返回一个连续的扁平数组(即展开的一维数组),与flatten不同,它返回的是数组视图(修改视图会影响原数组)。 |
例:
a = np.arange(9).reshape(3,3)
print(a)
for row in a:
print(row)
for ele in a.flat:
print(ele,end=",")
结果:
[[0 1 2]
[3 4 5]
[6 7 8]]
[0 1 2]
[3 4 5]
[6 7 8]
0,1,2,3,4,5,6,7,8,
函数名称 | 说明 |
---|---|
transpose | 将数组的维度值进行对换,比如数组维度(4,2)使用该方法后为(2,4)。 |
ndarray.T | 与transpose使用方法相同。 |
rollaxis | 沿着指定的轴向滚动至规定的位置。 |
swapaxes | 对数组的轴进行对换。 |
修改数组维度的操作主要由以下方法:
函数名称 | 描述说明 |
---|---|
broadcast | 生成一个模拟广播的对象。 |
broadcast_to | 将数组广播为新的形状。 |
expand_dims | 扩展数组的形状。 |
squeeze | 从数组的形状中删除一维项。 |
连接与分割数组是数组的两种操作方式
类型 | 函数名称 | 描述说明 | 语法 |
---|---|---|---|
连接数组方法 | concatenate | 沿指定轴连接两个或者多个相同形状的数组 | numpy.concatenate((a1,a2,...),axis) |
stack | 沿着新的轴连接一系列数组 | ||
hstack | 按水平顺序堆叠序列中数组(列方向) | numpy.hstack((a1,a2,...)) | |
vstack | 按垂直方向堆叠序列中数组(行方向) | ||
分割数组方法 | split | 将一个数组分割为多个子数组 | numpy.split(ary,indices_or_sections,axis) |
hsplit | 将一个数组水平分割为多个子数组(按列) | ||
vsplit | 将一个数组垂直分割为多个子数组(按行) |
主要有以下方法:
函数名称 | 描述说明 | 语法 |
---|---|---|
resize | 返回一个指定形状的数组,若新数组比原数组大,则会copy原数组中的值对新数组进行填充。resize仅对原数组进行修改,没有返回值 | numpy.resize(arr,shape) |
insert | 沿规定的轴将元素值插入到指定的元素前 | numpy.insert(arr,obj,values,axis) |
append | 将元素添加到数组的末尾 | numpy.append(arr,values,axis=None) |
delete | 删除某个轴上的子数组,并返回删除后的新数组 | numpy.delete(arr,obj,axis) |
argwhere | 返回数组内符合条件的元素的索引值 | |
unique | 用于删除数组中重复的元素,并按元素值由大到小返回一个新数组 | numpy.unique(arr,return_index,return_inverse,return_counts) |
NumPy提供了以下位运算
序号 | 函数 | 位运算符 | 描述说明 |
---|---|---|---|
1 | bitwise_and | & | 计算数组元素之间的按位与运算。 |
2 | bitwise_or | | | 计算数组元素之间的按位或运算。 |
3 | invert | ~ | 计算数组元素之间的按位取反运算。 |
4 | left_shift | << | 将二进制数的位数向左移。 |
5 | right_shift | >> | 将二进制数的位数向右移。 |
NumPy提供了许多字符串处理函数,它们被定义在用于处理字符串数组的numpy.char这个类中,这些函数的操作对象是string_或者unicode_字符串数组。如下表所示:
函数名称 | 描述 |
---|---|
add() | 对两个数组相应位置的字符串做连接操作。 |
multiply() | 返回多个字符串副本,比如将字符串“hello”乘以3,则返回字符串“hello hello hello” |
center() | 用于居中字符串,并将指定的字符填充在原字符串的左右两侧。 |
capitalize() | 将字符串第一个字母转换为大写。 |
title() | 标题样式,将每个字符串的第一个字母转换为大写形式。 |
lower() | 将数组中所有字符串的大学转换为小写。 |
upper() | 将数组中所有的字符串的小写转换为大写。 |
split() | 通过制定分隔符对字符串进行分割,并返回一个数组序列,默认分隔符为空格。 |
splitlines() | 以换行符作为分隔符来分隔字符串,并返回数组序列。 |
strip() | 删除字符串开头和结尾处的空字符 |
join() | 返回一个新的字符串,该字符串是以指定分隔符来连接数组中的所有元素 |
replace() | 用新的字符串替换原数组中指定的字符串 |
decode() | 用指定的编码格式对数组中元素依次执行解码操作 |
encode() | 用指定的编码格式对数组中元素依次进行编码操作 |
NumPy中提供了用于弧度计算的 sin()、 cos() 和 tan() 三角函数。
若想验证反三角函数的结果,可以通过 numpy.degrees() 将弧度转换为角度来实现
import numpy as np
arr = np.array([0, 30, 60, 90])
#正弦值数组
sinval = np.sin(arr*np.pi/180)
print(sinval)
#计算角度反正弦,返回值以弧度为单位
cosec = np.arcsin(sinval)
print(cosec)
#通过degrees函数转化为角度进行验证
print(np.degrees(cosec))
NumPy提供了三个舍入函数,介绍如下:
序号 | 函数 | 说明 | 语法 |
---|---|---|---|
1) | numpy.around() | 该函数返回一个十进制数值,并将数值四舍五入到指定的小数位上 | numpy.around(a,decimals) |
2) | numpy.floor() | 该函数表示对数组中的每个元素向下取整数,即返回不大于数组中每个元素值的最大整数 | numpy.floor() |
3) | numpy.ceil() | 该函数与floor函数相反,表示向上取整 | numpy.ceil() |
NumPy数组的“加减乘除”算术运算,分别对应add(),substract()、multiply()以及divide()
注意:做算术运算时,输入数组必须具有相同的形状,或者符合数组的广播规则,才可以执行运算
序号 | 函数 | 说明 |
---|---|---|
1 | numpy.reciprocal() | 该函数对数组中的每个元素取倒数,并以数组的形式将它们返回。当数组元素的数据类型int时,对于绝对值小于1的元素,返回值为0,而当数组中包含0元素时,返回值将出现overflow(inf)溢出提示 |
2 | numpy.power() | 该函数将a数组中的元素作为底数,把b数组中与a相对应的元素做幂,最后以数组形式返回两者的计算结果 |
3 | numpy.mod() | 返回两个数组相对应位置上元素相除后的余数,它与numpy.remainder()的作用相同 |
序号 | 函数 | 说明 |
---|---|---|
1 | numpy.real() | 返回复数数组的实部 |
2 | numpy.imag() | 返回复数数组的虚部 |
3 | numpy.conj() | 通过更改虚部的符号,从而返回共轭复数 |
4 | numpy.angle() | 返回复数参数的角度,该函数提供了一个deg参数,如果deg=True,则返回的值会以角度制来表示,否则以弧度制表示 |
序号 | 函数 | 说明 |
---|---|---|
1 | numpy.amin() | 沿指定的轴,查找数组中元素的最小值,并以数组形式返回,对于二维数组axis=1表示查找每行最小值,axis=0表示查找每列最小值 |
2 | numpy.amax() | 沿指定轴,查找数组中元素的最大值 |
3 | numpy.ptp() | 用于计算数组元素中最值之差,即(最大值-最小值),axis=1表示求每行最值之差 |
4 | numpy.percentile(a,q,axis) | 百分位数,是统计学中使用的一种度量单位。该函数表示沿指定轴,计算数组中任意百分比分位数 |
5 | numpy.median() | 用于计算a数组元素的中位数 |
6 | numpy.mean() | 该函数表示沿指定的轴,计算数组中元素的算术平均值(即元素之总和除以元素数量) |
7 | numpy.average(a,axis=None,weights=None,returned=False) | 加权平均值是将数组中各数组值乘以相应的权数,然后再对权重值求总和,最后以权重的总和除以总的单位数(即因子个数)。如果未指定axis值则数组被展开成一维。 |
8 | numpy.var() | 方差 |
9 | numpy.std() | 标准差 |
排序算法特征主要体现在以下四个方面:执行速度,最坏情况下的复杂度,所需工作空间以及算法的稳定性。下表列举了三种排序算法:
种类 | 速度 | 最坏复杂度 | 工作空间 | 稳定性 |
---|---|---|---|---|
quicksort(快速排序) | 1 | O(n^2) | 0 | 不稳定 |
mergesort(归并排序) | 2 | O(n*log(n)) | ~n/2 | 稳定 |
heapsort(堆排序) | 3 | O(n*log(n)) | 0 | 不稳定 |
序号 | 函数 | 说明 |
---|---|---|
1 | numpy.sort(a,axis,kind,order) | 对输入数组执行排序,并返回一个数组副本。 axis:如果没有指定axis,默认在最后一个轴上排序。axis=0表示按列排序,axis=1表示按行排序。 kind:默认为quicksort。 order表示要排序的字段。 |
2 | numpy.argsort() | 沿着指定的轴,对输入数组的元素值进行排序,并返回排序后的元素索引数组。 |
3 | numpy.lexsort() | 按键序列对数组进行排序,它返回一个已排序的索引数组,类似于numpy.argsort() |
序号 | 函数 | 说明 |
---|---|---|
1 | numpy.nonzero() | 该函数从数组中查找非零元素的索引位置 |
2 | numpy.where() | 该函数的返回值满足了给定条件的元素索引值 |
3 | numpy.extract() | 该函数的返回值是满足了给定条件的元素值 |
4 | numpy.argmax() | 该函数的返回值是最大值的索引值 |
5 | numpy.extract() | 该函数的返回值是最小值的索引值 |
副本是对原数组的深拷贝,和原数组具有不同的存储位置。视图是对原数组的引用,和原数组有相同的存储位置。
numpy.ndarray.byteswap() 将数组中每个元素的字节顺序进行大小端调换。
NumPy提供了一个矩阵库模块numpy.matlib
,该模块中的函数返回的是一个matrix对象,而非ndarray对象。
矩阵必须是二维的而数组可以是一维到任意维。矩阵由m行n列(m*n)元素排列而成,矩阵中的元素可以是数字、符号或数学公式等。
序号 | 函数 | 说明 |
1 | numpy.matlib.empty(shape,dtype,order) | 返回一个空矩阵。矩阵中会填充无意义的随机值。 shape:以元组的形式指定矩阵的形状。 order:有两种选择,C(行矩阵优先),F(列矩阵优先) |
2 | numpy.matlib.zeros() | 创建一个以0填充的矩阵 |
3 | numpy.matlib.ones() | 创建一个以1填充的矩阵 |
4 | numpy.matlib.eye(n,M,k,dtype) | 返回一个对角线元素为1,而其他元素为0的矩阵。 n:返回矩阵的行数; M:返回矩阵的列数,默认为n; k:对角线的索引 dtype:矩阵中元素数据类型 |
5 | numpy.matlab.identity() | 返回一个给定大小的单位矩阵,矩阵的对角线元素为1,而其他元素均为0 |
6 | numpy.matlib.rand() | 创建一个以随机数填充,并给定维度的矩阵 |
NumPy提供了numpy.linalg模块,该模块中包含了一些常用的线性代数计算方法
函数名称 | 描述说明 |
---|---|
numpy.dot | 两个数组的点积。将a数组的每一行元素与b数组的每一列元素相乘再相加,每一行列组合各输出一个值。 |
numpy.vdot | 两个向量的点积。即矩阵对应位置元素乘积之和。 |
numpy.inner | 两个数组的内积。即两数组每行相乘再相加,只有当数组为一维时结果与dot()相同。 |
numpy.matmul | 两个数组的矩阵积。返回两个矩阵的乘积,假如两个矩阵的维度不一样就会产生错误。 |
numpy.linalg.det | 计算输入矩阵的行列式。通过对角线元素求行列式(“一捺一撇”)。 |
numpy.linalg.solve | 求解线性矩阵方程,并以矩阵的形式表示线性方程的解。 |
inv | 计算矩阵的逆矩阵,逆矩阵与原始矩阵相乘,会得到单位矩阵。 |
函数 | 说明 |
---|---|
numpy.multiple() | 逐元素矩阵乘法,用于两个矩阵的逐元素乘法 |
numpy.matmul() | 矩阵乘积运算,用于计算两个数组的乘积,即矩阵a的行与矩阵b的列相乘再相加 |
numpy.dot() | 矩阵点积,用于计算两个矩阵的点积 |
格式化字符:
字符 | 描述 | 字符 | 描述 |
---|---|---|---|
'-' | 实线样式 | '--' | 短横线样式 |
'-.' | 点划线样式 | ':' | 虚线样式 |
'.' | 点标记 | ',' | 像素标记 |
'o' | 圆标记 | '*' | 星形标记 |
'v' | 倒三角形标记 | '^' | 正三角形标记 |
'<' | 左三角形标记 | '>' | 右三角形标记 |
'1' | 上箭头标记 | '2' | 下箭头标记 |
'3' | 左箭头标记 | '4' | 右箭头标记 |
's' | 正方形标记 | 'p' | 五边形标记 |
'h' | 六边形标记1 | 'H' | 六边形标记2 |
'+' | 加号标记 | 'X' | X标记 |
'D' | 菱形标记 | 'd' | 窄菱形标记 |
'|' | 竖直线标记 | '_' | 水平线标记 |
颜色字符:
字符 | 颜色 | 字符 | 颜色 |
---|---|---|---|
'b' | 蓝色 | 'g' | 绿色 |
'r' | 红色 | 'c' | 青色 |
'm' | 品红色 | 'y' | 黄色 |
'k' | 黑色 | 'w' | 白色 |
常用绘图函数:
函数 | 说明 |
---|---|
plt.subplot(nrows,ncols,index,**kwargs) | 该函数用三个整数描述子图的位置信息,这三个整数是行数、列数和索引值(此索引值从1开始)。例如plt.subplot(2,3,2)表示子图位于第1行第2列的第2个位置上。 |
plt.bar() | 可生成柱状图 |
numpy.histogram(array,bins=10,range=None,weights=None,density=False) | 直方图是一种表示数据概率分布的常用图形。该函数以直方图的形式表示一组数据的概率分布值。有两个返回值,分别是hist(直方图高度值)和bin_edges(数值区间范围) |
plt.hist() | 该函数将一个输入数组和bins数组作为参数,并将其输出为直方图 |
NumPy IO操作是以文件的形式从磁盘中加载ndarray对象。在此过程中NumPy以两种文件类型处理ndarray对象,分别对应不同的IO方法如下:
文件类型 | 处理方法 |
---|---|
二进制文件(以.npy结尾) | load()和save(file,allow_pickle=True,fix_imports=True) file:保存后的文件名,后缀为.npy。 allow_pickle:可选项,布尔值参数,允许使用pickle序列化保存数组对象。 |
普通文本文件 | loadtxt()和savetxt('filename文件路径',self.task,fmt="%d",delimiter=" ") self.task:要保存数组的变量名 fmt="%d":指定保存文件的格式,默认是十进制 delimiter=" ":表示分隔符,默认以空格形式隔开 |