1 创建数组
1.1 数组 array()
x=np.array(object,dtype=None,copy=True,order=None,subok=False,ndmin=0)
| 参数 |
说明 |
| object |
必选,为一个序列型对象,如列表、元组、集合等,还可以是一个已创建好的数组 |
| dtype |
可选,用于指定数组元素的数据类型 |
| copy |
可选,用于设置是否需要复制对象 |
| order |
可选,用于指定创建数组的样式 |
| subok |
可选,默认返回一个与基类的类型一致的数组 |
| ndmin |
可选,用于指定生成数组的最小维度 |
1.2 等差数组 arange()
x=np.arange(start,stop,step,dtype=None)
| 参数 |
说明 |
| start |
可选,表示起始值。如果省略,则默认为0 |
| stop |
必选,表示结束值,生成的数组元素不包括该值 |
| step |
可选,表示步长。如果省略,则默认为1:如果指定了该参数,则必须给出参数 start 的值 |
| dtype |
可选,表示创建的数组元素的数据类型。默认值为 Non ,如果省略,则从其他参数推断数据类型 |
1.3 其他方法
#全1数组
>>> np.ones((2,3))
array([[1., 1., 1.],
[1., 1., 1.]])
#全0数组
>>> np.zeros((2,3),dtype=np.int32)
array([[0, 0, 0],
[0, 0, 0]])
#不填充值
>>> np.empty((2,2))
array([[4.76558753e+180, 1.46923440e+195],
[2.44048419e-152, 6.96411114e+252]])
#填充特定值
>>> np.full((2,3),6)
array([[6, 6, 6],
[6, 6, 6]])
#等差数列
#linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)
>>> np.linspace(1,11,6)
array([ 1., 3., 5., 7., 9., 11.])
#等比数列
#logspace(start,stop,num=50,endpoint=True,base=10.0,dtype=None)
>>> np.logspace(1,5,5,base=2)
array([ 2., 4., 8., 16., 32.])
1.3 随机数组
#1.rand()
x=np.random.rand(3)
>>>[0.23991472 0.42578649 0.83421479]
x=np.random.rand(2,3)
>>>[[0.08081472 0.28780562 0.91088001]
[0.13229275 0.03861983 0.74028659]]
#2.randn() 符合标准正态分布
>>> np.random.randn(3)
array([-0.27443177, -0.95246366, 0.37323299])
>>> np.random.randn(2,3)
array([[-0.55244484, 0.49217026, 0.83044099],
[ 0.19686954, 2.22208364, -0.50861106]])
#3.randint() 指定范围的随机整数
>>> np.random.randint(1,5,10)
array([2, 2, 1, 3, 3, 3, 2, 4, 4, 2])
#4.normal() 生成正态分布的随机数
#numpy.random.normal(loc,scale,size)
>>> np.random.normal(85,10,(2,5))
array([[77.61266301, 93.17333781, 74.97514828, 90.90911221, 86.76121475],
[83.031985 , 94.36001514, 90.91494467, 84.11853472, 84.32256207]])
1.4 从已有数组中创建数组
#numpy.asarray(a,dtype=None,order=None)
#同array(),不过参数是数组类型array时,array()返回copy,asarray()只想同一块内存
>>> arr1=np.array([3,2])
>>> arr2=np.asarray(arr1)
>>> arr1
array([3, 2])
>>> arr2=arr2.sort()
>>> arr1
array([2, 3])
#numpy.frombuffer(buffer,dtype=float,count=-1,offset=0)
#numpy.fromiter(iterable,dtype,count=-1)
#可迭代对象
>>> np.fromiter(range(10),dtype=np.int32)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#numpy.empty_like(prototype,dtype=None,order='K',subok=True)
#创造一个与给定数组具有相同维度和数据类型且未初始化的数组
>>> arr
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
>>> np.empty_like(arr)
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
#numpy.zeros_like()
>>> np.zeros_like(arr)
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
#numpy.ones_like()
>>> np.ones_like(arr)
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]])
#numpy.full_like(a,fill_value,dtype=None,order='K',subok=True)
>>> np.full_like(arr,6)
array([[6, 6, 6, 6, 6],
[6, 6, 6, 6, 6],
[6, 6, 6, 6, 6],
[6, 6, 6, 6, 6]])
2 查看数组属性
>>> arr=np.array([[1,2],[3,4],[5,6]])
#1.行数和列数
>>> arr.shape
(3, 2)
>>> arr.size
#2.元素个数
6
#3.数据类型
>>> arr.dtype
dtype('int32')
#4.维数
>>> arr.ndim
2
| 数据类型 |
描述 |
数据类型 |
描述 |
| bool_ |
|
|
|
| int_ |
|
uint64 |
|
| intc |
|
float_ |
|
| intp |
|
float16 |
|
| int8 |
|
float32 |
|
| int16 |
|
float64 |
|
| int32 |
|
complex_ |
|
| int64 |
|
complex64 |
|
| uint8 |
|
complex128 |
|
| uint16 |
|
datetime64 |
|
| uint32 |
|
timedelta64 |
|
3 选取数组元素
>>> arr
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
#普通索引
#arr[x1]
>>> arr[3]
array([15, 16, 17, 18, 19])
#arr[x1,y1]
>>> arr[3,2]
17
#花式索引
#arr[[x1,x2,...,xn]]
>>> arr[[0,3]]
array([[ 0, 1, 2, 3, 4],
[15, 16, 17, 18, 19]])
#arr[[x1,x2,...,xn],[y1,y2,...,yn]]
>>> arr[[0,3],[4,4]]
array([ 4, 19])
>>>
#切片 [start:stop:step]
>>> arr[:2]
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
>>> arr[::2]
array([[ 0, 1, 2, 3, 4],
[10, 11, 12, 13, 14]])
>>> arr[::2,-2:-3:-1]
array([[ 3],
[13]])
#整数索引和切片可混用
>>> arr[::2,-1]
array([ 4, 14])
#切片赋值:一个标量值
>>> arr[::2,-1]=100
>>> arr
array([[ 0, 1, 2, 3, 100],
[ 5, 6, 7, 8, 9],
[ 10, 11, 12, 13, 100],
[ 15, 16, 17, 18, 19]])
#切片赋值:数组或列表
>>> arr[::2,-1]=[101,102]
>>> arr
array([[ 0, 1, 2, 3, 101],
[ 5, 6, 7, 8, 9],
[ 10, 11, 12, 13, 102],
[ 15, 16, 17, 18, 19]])
#布尔索引
>>> arr==6
array([[False, False, False, False, False],
[False, True, False, False, False],
[False, False, False, False, False],
[False, False, False, False, False]])
#可用作数组索引
>>> arr1
array([[60, 61, 62, 63, 64],
[65, 66, 67, 68, 69],
[70, 71, 72, 73, 74],
[75, 76, 77, 78, 79]])
>>> arr1[arr==6]
array([66])
#布尔索引可以和整数索引、切片索引混用,使用&|的布尔运算符
>>> arr1[(arr==6) | (arr==8)]
array([66, 68])
4 排序
>>> arr
array([[3, 5, 7],
[2, 5, 1]])
#sort() axis=0按列排序,axis=1按行排序,默认按行排序
>>> arr.sort()
>>> arr
array([[3, 5, 7],
[1, 2, 5]])
>>> arr.sort(axis=0)
>>> arr
array([[1, 2, 5],
[3, 5, 7]])
#argsort()返回排序后,元素在原数组中的下表列表
>>> arr
array([[6, 1, 4],
[3, 0, 9]])
>>> arr.argsort()
array([[1, 2, 0],
[1, 0, 2]], dtype=int64)
#lexsort() 多级排序,最后一个key优先
#axis=1按行排序
>>> arr
array([[3, 3, 8],
[6, 9, 7],
[3, 3, 2]])
>>> index=np.lexsort((arr[:,2],arr[:,1],arr[:,0]))
>>> index
array([2, 0, 1], dtype=int64)
>>> arr[index]
array([[3, 3, 2],
[3, 3, 8],
[6, 9, 7]])
5 数组重塑
5.1 改变数组形状
#resize()和reshape()相同,区别在于resize()改变数组本身
>>> arr
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],])
>>> arr.reshape(5,4)
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
>>> arr
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
>>> arr.resize(5,4)
>>> arr
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
#transpose()
>>> arr
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
>>> arr.transpose()#arr.transpose(1,0)
array([[ 0, 6, 12, 18],
[ 1, 7, 13, 19],
[ 2, 8, 14, 20],
[ 3, 9, 15, 21],
[ 4, 10, 16, 22],
[ 5, 11, 17, 23]])
#swapaxes()对轴两两置换
>>> arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
>>> arr.shape
(2, 3, 4)
>>> arr.swapaxes(1,2)#等价于arr.swapaxes(2,1)
array([[[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]],
[[12, 16, 20],
[13, 17, 21],
[14, 18, 22],
[15, 19, 23]]])
>>>
#flatten() 返回一个折叠成一维的数组
>>> arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
>>> arr.flatten()
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])
5.2 数组翻转
#上下翻转 numpy.flipud() ud=up-down
#向量用filpud(),因为向量是竖着排的
>>> arr
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
>>> np.flipud(arr)
array([[18, 19, 20, 21, 22, 23],
[12, 13, 14, 15, 16, 17],
[ 6, 7, 8, 9, 10, 11],
[ 0, 1, 2, 3, 4, 5]])
#左右翻转 numpy.fliplr() lr=left-right
>>> np.fliplr(arr)
array([[ 5, 4, 3, 2, 1, 0],
[11, 10, 9, 8, 7, 6],
[17, 16, 15, 14, 13, 12],
[23, 22, 21, 20, 19, 18]])
>>>
5.3 数组分裂
#一维数组→一维数组,多维数组→多维数组
#numpy.split(arr,n) 把arr均分为n个
>>> arr
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
>>> np.split(arr,2)
[array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]]), array([[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])]
#numpy.sply(arr,[obj1,obj2,obj3...]) 按指定索引位置拆分
>>> ar
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.split(ar,[3,8,9])
[array([0, 1, 2]), array([3, 4, 5, 6, 7]), array([8]), array([9])]
#numpy.hsplit(arr,n) 横向拆分
>>> np.hsplit(arr,2)
[array([[ 0, 1, 2],
[ 6, 7, 8],
[12, 13, 14],
[18, 19, 20]]), array([[ 3, 4, 5],
[ 9, 10, 11],
[15, 16, 17],
[21, 22, 23]])]
#numpy.vsplit(arr,n) 竖向拆分
>>> np.vsplit(arr,2)
[array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]]), array([[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])]
6 数组的增删改查
6.1 增加
#numpy.append(arr,values,axis=None) 返回一个一维数组
>>> np.append(arr,np.arange(6))
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 0, 1, 2, 3, 4, 5])
>>> np.append(arr,[6,5,4,3,2,1])
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 6, 5, 4, 3, 2, 1])
#水平方向增加数据
#numpy.concatenate(arr1,arr2,axis=1)/hstack((arr1,arr2))
>>> ar
array([1, 1, 1, 1])
>>> np.hstack((ar,ar))
>>> ar
array([[1],
[1],
[1],
[1]])
>>> np.hstack((arr,ar))
array([[ 0, 1, 2, 3, 4, 5, 1],
[ 6, 7, 8, 9, 10, 11, 1],
[12, 13, 14, 15, 16, 17, 1],
[18, 19, 20, 21, 22, 23, 1]])
#垂直方向增加数据
#numpy.concatenate(arr1,arr2,axis=0)/vstack((arr1,arr2))
>>> arr
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
>>> ar
array([0, 0, 0, 0, 0, 0])
>>> np.vstack((arr,ar))
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[ 0, 0, 0, 0, 0, 0]])
#numpy.insert(arr,obj,values,axis)
#axis省略,数组展开为一维数组
#axis=0,竖直方向上添加
#axis=1,水平方向添加
>>> np.insert(arr,2,[1,1,1,1,1,1],axis=0)
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[ 1, 1, 1, 1, 1, 1],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
6.2 删改查
#删除
#numpy.delete(arr,obj,axis) axis不可省略
>>> np.delete(arr,2,axis=0)
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[18, 19, 20, 21, 22, 23]])
>>> np.delete(arr,2,axis=1)
array([[ 0, 1, 3, 4, 5],
[ 6, 7, 9, 10, 11],
[12, 13, 15, 16, 17],
[18, 19, 21, 22, 23]])
#修改
>>> arr[3]=np.array([1,3,5,5,6,6])
>>> arr
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[ 1, 3, 5, 5, 6, 6]])
#查询
#numpy.where(condition,x,y)
>>> np.where(arr>=6,6,0)
array([[0, 0, 0, 0, 0, 0],
[6, 6, 6, 6, 6, 6],
[6, 6, 6, 6, 6, 6],
[0, 0, 0, 0, 6, 6]])
>>> arr_w=arr[np.where(arr>=6)]
>>> arr_w
array([ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 6, 6])
6.3 处理缺失值、重复值
#处理数组缺失值
#arr[np.isnan(arr)]=value
#处理数组重复值
#numpy.unique(arr)
>>> arr
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[ 1, 3, 5, 5, 6, 6]])
>>> np.unique(arr)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17])
#arr1是去重后的新数组,arr2是去重后数组中元素在原数组中出现的次数
>>> arr1,arr2=np.unique(arr,return_counts=True)
>>> arr1
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17])
>>> arr2
array([1, 2, 1, 2, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=int64)
7 Numpy数组间运算
7.1 四则运算
>>> arr1
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
>>> arr2
array([[2, 2, 2, 2, 2, 2],
[2, 2, 2, 2, 2, 2],
[2, 2, 2, 2, 2, 2],
[2, 2, 2, 2, 2, 2]])
# + - * / ** () // %
>>> arr1+arr2
array([[ 2, 3, 4, 5, 6, 7],
[ 8, 9, 10, 11, 12, 13],
[14, 15, 16, 17, 18, 19],
[20, 21, 22, 23, 24, 25]])
>>> arr1+3
array([[ 3, 4, 5, 6, 7, 8],
[ 9, 10, 11, 12, 13, 14],
[15, 16, 17, 18, 19, 20],
[21, 22, 23, 24, 25, 26]])
>>> arr1/arr2
array([[ 0. , 0.5, 1. , 1.5, 2. , 2.5],
[ 3. , 3.5, 4. , 4.5, 5. , 5.5],
[ 6. , 6.5, 7. , 7.5, 8. , 8.5],
[ 9. , 9.5, 10. , 10.5, 11. , 11.5]])
>>> arr1**arr2
array([[ 0, 1, 4, 9, 16, 25],
[ 36, 49, 64, 81, 100, 121],
[144, 169, 196, 225, 256, 289],
[324, 361, 400, 441, 484, 529]])
>>> arr1//arr2
array([[ 0, 0, 1, 1, 2, 2],
[ 3, 3, 4, 4, 5, 5],
[ 6, 6, 7, 7, 8, 8],
[ 9, 9, 10, 10, 11, 11]])
>>> arr1%arr2
array([[0, 1, 0, 1, 0, 1],
[0, 1, 0, 1, 0, 1],
[0, 1, 0, 1, 0, 1],
[0, 1, 0, 1, 0, 1]])
#广播:两个不同形状的数组
7.2 矩阵运算
#矩阵乘法 必须满足(m,n)*(n,r)
>>> np.dot(arr1,arr2.T)
array([[ 30, 30, 30, 30],
[102, 102, 102, 102],
[174, 174, 174, 174],
[246, 246, 246, 246]])
#矩阵转置
>>> arr1.T
array([[ 0, 6, 12, 18],
[ 1, 7, 13, 19],
[ 2, 8, 14, 20],
[ 3, 9, 15, 21],
[ 4, 10, 16, 22],
[ 5, 11, 17, 23]])
#矩阵求逆
#矩阵可逆=矩阵满秩=非奇异矩阵 numpy.linalg.inv()
#矩阵不可逆=奇异矩阵 numpy.linalg.pinv()求伪逆
8 运算函数
8.1 数学运算函数
#numpy.add(arr1,arr2)
#numpy.subtract(arr1,arr2)
#numpy.multiply(arr1,arr2)
#numpy.divide(arr1,arr2)
#numpy.reciprocal(arr) 倒数
>>> np.reciprocal(arr)
array([[ inf, 1. , 0.5 , 0.33333333, 0.25 ,
0.2 ],
[0.16666667, 0.14285714, 0.125 , 0.11111111, 0.1 ,
0.09090909],
[0.08333333, 0.07692308, 0.07142857, 0.06666667, 0.0625 ,
0.05882353],
[0.05555556, 0.05263158, 0.05 , 0.04761905, 0.04545455,
0.04347826]])
#numpy.power(arr,n)/numpy.power(arr1,arr2) 求幂
#numpy.mod(arr1,arr2) 取余
#numpy.around(arr,n) 舍入函数
>>> np.around(np.reciprocal(arr),4)
array([[ inf, 1. , 0.5 , 0.3333, 0.25 , 0.2 ],
[0.1667, 0.1429, 0.125 , 0.1111, 0.1 , 0.0909],
[0.0833, 0.0769, 0.0714, 0.0667, 0.0625, 0.0588],
[0.0556, 0.0526, 0.05 , 0.0476, 0.0455, 0.0435]])
#numpy.ceil()向上取整
#numpy.floor()向下取整
#三角函数
#sin,cos,tan,arcsin,arccos,arctan
#degrees()弧度转角度
>>> arr
array([ 0, 30, 45, 60, 90])
>>> np.sin(arr*np.pi/180)
array([0. , 0.5 , 0.70710678, 0.8660254 , 1. ])
8.2 统计分析函数
>>> arr
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
#numpy.sum() 求和
>>> np.sum(arr)
45
>>> np.sum(arr[0])
10
>>> np.sum(arr,axis=0)
array([ 5, 7, 9, 11, 13])
#numpy.comsum() 累计求和
>>> np.cumsum(arr)
array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
#numpy.comprod() 累计求积
>>> np.cumprod(np.arange(1,11))
array([ 1, 2, 6, 24, 120, 720, 5040,
40320, 362880, 3628800])
#numpy.mean() 求平均值
>>> np.mean(arr)
4.5
#numpy.min()\numpy.max()
>>> np.min(arr)
0
>>> np.max(arr)
9
#numpy.average(arr,axis=None,weights=ndarray) 加权平均
>>> arr1
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
>>> arr2
array([[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0]])
>>> np.average(arr1,weights=arr2)
21.0
>>> np.average(arr1,axis=1,weights=arr2[3])
array([ 3., 9., 15., 21.])
#numpy.median() 中位数
#numpy.var() 方差
#numpy.std() 标准差
#numpy.argmin()\numpy.argmax() 最小值和最大值的下表(一维的下标)
#unravel_index() 根据数组形状把一维下标转换成多维下表
>>> np.unravel_index(np.argmax(arr1),arr1.shape)
(3, 5)
#numpy.ptp() 数组最大值和最小值的差
>>> np.ptp(arr1)
23