1、numPy:Numerical Python,即数值Python包,是Python进行科学计算的一个基础包,所以是一个掌握其他Scipy库中模块的基础模块,一定需要先掌握该包的主要使用方式。(官网:http://www.numpy.org/)(官方文档:https://docs.scipy.org/doc/numpy/user/index.html)
2、NumPy模块是Python的一种开源的数值计算扩展,是一个用python实现的科学计算包,主要包括:
(1)一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组,称为ndarray(N-dimensional array object)
(2)用于对整组数据进行快速运算的标准数学函数:ufunc(universal function object)
(3)实用的线性代数、傅里叶变换和随机数生成函数。
(4)NumPy和稀疏矩阵的运算包Scipy配合使用更加方便。
3、NumPy核心数据结构:ndarray
(1)NumPy的数组类被称作ndarray。通常被称作数组。注意numpy.array和标准Python库类array.array并不相同,后者只处理一维数组和提供少量功能。
(2)一种由相同类型的元素组成的多维数组,元素数量是实现给定好的
(3)元素的数据类型由dtype(data-type)对象来指定,每个ndarray只有一种dtype类型
(4)ndarray的大小固定,创建好数组后数组大小是不会再发生改变的
第一步:导入numpy库:import numpy as np
第二步:选择以下9中方法创建所需的ndarray
(1)np.array()
print(np.array([1,2,3])) #用列表创建一维数组
print(np.array((1,2,3))) #用元组创建一维数组
print(np.array([[1,2,3],[3,4,5]])) #创建二维数组
print(np.array([[[1,2,3],[3,4,5]], [[4,5,6],[7,8,9]]])) #创建三维数组
运行结果:
[1 2 3]
[1 2 3]
[[1 2 3]
[3 4 5]]
[[ [1 2 3]
[3 4 5]]
[[4 5 6]
[7 8 9]]]
(2)np.arange(m,n,p):创建一维数组;m为起点,默认值为0;n-1为终点;p为步长,默认值为1
print(np.arange(9)) #一个参数时代表是n值
print(np.arange(0,9,3))
运行结果:
[0 1 2 3 4 5 6 7 8]
[0 3 6]
(3)np.random.random((m,n,p)):创建随机数组,范围0-1之间,m为维数,默认为1; n为行数,默认为你1; p为列数,默认为你1.
print(np.random.random())
print(np.random.random((3,3)))
print(np.random.random((3,4,5)))
运行结果:
0.8662175412604185
[[0.39977554 0.53905535 0.98797601]
[0.30052583 0.48654865 0.52708454]
[0.79963669 0.57747023 0.60574091]]
[[[0.4739109 0.34896628 0.53766609 0.32580308 0.20995876]
[0.34513019 0.6905552 0.39049827 0.96181027 0.12415947]
[0.31232772 0.99593459 0.52628405 0.88970223 0.71259597]
[0.06166204 0.49729526 0.21848856 0.8274129 0.12596696]]
[[0.17472248 0.03599495 0.04836849 0.39497355 0.39231837]
[0.63703022 0.5226203 0.42291038 0.0780945 0.50046054]
[0.06722677 0.4903806 0.50076114 0.71733274 0.55196836]
[0.05347855 0.30551677 0.75455515 0.76474896 0.02347691]]
[[0.20968339 0.82138698 0.19611095 0.72279878 0.47167353]
[0.38738273 0.6984346 0.50095254 0.40237524 0.88877301]
[0.96705408 0.46714721 0.43656449 0.62625771 0.09937583]
[0.46108697 0.81385325 0.07755153 0.84041035 0.75572835]]]
(4)np.random.randint((m,n,size=(a,b))):创建随机整数数组,选值的范围是[m,n); a是数组的行;b是数组的列数
print(np.random.randint(1,9, size=(3,4)))
运行结果:
[[7 5 4 1]
[6 6 7 2]
[2 1 3 1]]
(5)np.linspace(m,n,p):创建一维等差数列,m为起点;n-1为终点;p为步长,默认值为1.
print(np.linspace(0,8,5))
运行结果:
[0. 2. 4. 6. 8.]
(6)np.logspace(m,n,p,base):创建等比数列,m为幂次的起点,n-1为幂次的终点,p为数组的个数,base为幂次的底数,默认为10
print(np.logspace(0, 2, 5))
print(np.logspace(0, 5, 6, base=2))
运行结果:
[ 1. 3.16227766 10. 31.6227766 100. ]
[ 1. 2. 4. 8. 16. 32.]
(6)np.zeros((m,n)):创建一个m*n初始值全部为0的数组
print(np.zeros((3,4)))
运行结果:
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
(7)np.ones((m,n)):ones创建一个m*n初始值全部为1的数组
print(np.ones((3,3)))
运行结果:
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
(8)np.random.randn(m,n):创建一个标准正态分布的数组,m表示行数;n表示列数。
print(np.random.randn(3,2))
运行结果:
[[-1.16378384 -0.92897224]
[ 1.94134629 1.63933644]
[-1.2225152 0.24974909]]
(9)将一维矩阵(数组)转换成多维:reshape(m,n):改变矩阵是行数和列数,若m,n中有且只有一个为-1,表示自适应。
arr1 = np.array([1,2,3,4,5,6,7,8]).reshape(2,-1)
print(arr1)
arr2 = np.arange(9).reshape(3,3) #注意reshape的多维矩阵元素个数一定要和arange的元素个数保持一致!
print(arr2)
运行结果:
[[1 2 3 4]
[5 6 7 8]]
[[0 1 2]
[3 4 5]
[6 7 8]]
第一步:ndarray的创建
第二步:创建的ndarray的相关方法和属性的使用:
1、arr.ndim:数组轴(维数)的个数,轴的个数被称为秩.
(1)arr = np.random.randint(1, 9, size=(3,3))
print(arr.ndim)
输出结果:
2
2、arr.shape:数组的维度, 例如一个2排3列的矩阵,它的shape属性将是(2,3),这个元组的长度显然是秩,
即维度或者ndim属性
(1)arr = np.random.randint(1, 9, size=(3,3))
print(arr.shape)
输出结果:
(3, 3)
3、arr.size:数组元素的总个数,等于shape属性中元组元素的乘积
(1)arr = np.random.randint(1, 9, size=(3,3))
print(arr.size)
输出结果:
9
4、arr.dtype:一个用来描述数组中元素类型的对象,可以通过创造或指定dtype使用标准Python类型。
不过NumPy提供它自己的数据类型。
(1)arr = np.random.randint(1, 9, size=(3,3))
print(arr.dtype)
输出结果:
int32
5、arr.itemsize:数组中每个元素的字节大小。例如,一个元素类型为float64的数组itemsiz属性值为8(=64/8),
又如,一个元素类型为complex32的数组item属性为4(=32/8).
(1)arr = np.random.randint(1, 9, size=(3,3))
print(arr.itemsize)
输出结果:
4
6、arr.astype():更改一个已经存在的数组的数据类型,从而得到一个新数组
(1)arr = np.random.randint(1, 9, size=(3,3))
print(arr.dtype)
arr2 = arr.astype(float)
print(arr2.dtype)
输出结果:
int32
float64
7、arr.reshape(m,n):改变矩阵是行数和列数,若m,n中有且只有一个为-1,表示自适应
(1)arr = np.np.array([1,2,3,4,5,6,7,8])
print(arr.reshape(2,4))
arr = np.np.array([1,2,3,4,5,6,7,8])
print(arr.reshape(2,-1))
输出结果:
[[1 2 3 4]
[5 6 7 8]]
[[1 2 3 4]
[5 6 7 8]]
8、矩阵的转置:arr.transpose()和arr.T
(1)arr1 = np.arange(40).reshape(5,-1)
print(arr1)
arr2 = arr1.transpose()
print(arr2)
arr3 = arr1.T
print(arr3)
运行结果:
[[ 0 1 2 3 4 5 6 7]
[ 8 9 10 11 12 13 14 15]
[16 17 18 19 20 21 22 23]
[24 25 26 27 28 29 30 31]
[32 33 34 35 36 37 38 39]]
[[ 0 8 16 24 32]
[ 1 9 17 25 33]
[ 2 10 18 26 34]
[ 3 11 19 27 35]
[ 4 12 20 28 36]
[ 5 13 21 29 37]
[ 6 14 22 30 38]
[ 7 15 23 31 39]]
[[ 0 8 16 24 32]
[ 1 9 17 25 33]
[ 2 10 18 26 34]
[ 3 11 19 27 35]
[ 4 12 20 28 36]
[ 5 13 21 29 37]
[ 6 14 22 30 38]
[ 7 15 23 31 39]]
9、多维数组的索引和切片
(1)arr1 = np.random.randint(1,9,size=(2,3,3))
print(arr1)
print(arr1[0,1,2]) #==print(arr1[0][1][2])
print(arr1[:,:,2])
print(arr1[:,1,1:3])
运行结果:
[[[2 3 2]
[7 4 3]
[2 2 2]]
[[1 4 4]
[5 6 8]
[1 8 3]]]
3
[[2 3 2]
[4 8 3]]
[[4 3]
[6 8]]
10、多维数组的花样索引:两种方法
(1)切片
arr1 = np.random.randint(1,9,size=(8,4))
print(arr1)
print(arr1[[0,3,5],[0,3,2]]) #取(0,0)(3,3)(5,2)三个元素
运行结果:
[[4 3 2 3]
[8 7 7 6]
[3 6 2 4]
[5 6 8 5]
[3 4 8 5]
[2 7 3 6]
[3 4 7 8]
[6 3 7 1]]
[4 5 3]
(2)索引器.ix_()
print(arr1[np.ix_([0,3,5],[0,3,2])]) #取(0,0)(0,3)(0,2);(3,0)(3,3)(3,2);(5,0)(5,3)(5,2)9个元素
运行结果:
[[4 3 2]
[5 5 8]
[2 6 3]]
11、布尔索引
(1)
arr1 = np.random.random((3,3))
print(arr1)
arr2 = arr1<0.5
print(arr2)
运行结果:
[[0.86375266 0.97297189 0.80719292]
[0.36599514 0.39084747 0.05975864]
[0.93682142 0.14530861 0.32880287]]
[[False False False]
[ True True True]
[False True True]]
(2)
name = np.array(['Gerry', 'Tom', 'Jim'])
scores = np.array([[88,86,96],
[76,88,95],
[90,85,92]])
classes = np.array(['语文','数学','英语'])
print('Gerry所有的成绩是:',scores[name == 'Gerry'])
print('Gerry的数学成绩是:',scores[name == 'Gerry', classes == '数学'])
print('Gerry和Tom的所有成绩是:',scores[(name == 'Gerry')|(name == 'Tom')])
运行结果:
Gerry所有的成绩是: [[88 86 96]]
Gerry的数学成绩是: [86]
Gerry和Tom的所有成绩是: [[88 86 96]
[76 88 95]]
1、ndarray与标量之间的计算
(1)arr1 = np.array((1,2,3,4,5))
print(arr1+2)
print(arr1-3)
print(arr1*2)
print(arr1/2)
print(arr1**2)
输出结果:
[3 4 5 6 7]
[-2 -1 0 1 2]
[ 2 4 6 8 10]
[0.5 1. 1.5 2. 2.5]
[ 1 4 9 16 25]
2、ndarray与ndarray之间的计算
(1)加法与乘法
arr2 = np.array([[1,2,3],[4,5,6]])
arr3 = np.array([[10,20,30], [40,50,60]])
print(arr2+arr3)
print(arr2*arr3)#相乘的两者结构相同
输出结果:
[[11 22 33]
[44 55 66]]
[[ 10 40 90]
[160 250 360]]
(2)点积:np.dot()函数
arr1 = np.array(((1,2,3),
(4,5,6),
(7,8,9)))
arr2 = np.array(((1,2),
(3,4),
(5,6)))
print(np.dot(arr1,arr2))
输出结果:
[[ 22 28]
[ 49 64]
[ 76 100]]
2、常见二元函数
3、聚合函数
(1)定义:聚合函数是对一组值(eg一个数组)进行操作,返回一个单一值作为结果的函数。当然聚合函数也可以指定对某个具体的轴进行数据聚合操作;常将的聚合操作有:平均值、最大值、最小值、方差等等.
(2)例子
arr = np.array([[1,5,7,4],[0,6,3,8],[2,6,9,7]])
print(arr)
print(‘arr的最小值是:’,arr.min())
print(‘arr的最大值是:’,arr.max())
print(‘arr的平均值是:’,arr.mean())
print(‘arr的标准差差是:’,arr.std())
print(‘arr的方差是:’, np.power(arr.std(),2))
print(‘arr中每一行的最小值是:’,arr.min(axis=0)) #当axis=0表示行;axis=1表示列.
print(‘arr中每一行的最大值是:’,arr.max(axis=0))
print(‘arr中每一行的平均值是:’,arr.mean(axis=0)
print(‘arr中每一列的最小值是:’,arr.min(axis=1))
print(‘arr中每一列的最大值是:’,arr.max(axis=1))
print(‘arr中每一列的平均值是:’,arr.mean(axis=1))
运行结果:
[[1 5 7 4]
[0 6 3 8]
[2 6 9 7]]
arr的最小值是: 0
arr的最大值是: 9
arr的平均值是: 4.833333333333333
arr的标准差差是: 2.733536577809454
arr的方差是: 7.472222222222221
arr中每一行的最小值是: [0 5 3 4]
arr中每一行的最大值是: [2 6 9 8]
arr中每一行的平均值是: [1. 5.66666667 6.33333333 6.33333333]
arr中每一列的最小值是: [1 0 2]
arr中每一列的最大值是: [7 8 9]
arr中每一列的平均值是: [4.25 4.25 6. ]
(3)标准差、方差和协方差(有关更详细说明看https://blog.csdn.net/cqfdcw/article/details/78173839 )
A、计算公式:
标准差:
方差:是标准差的平方
协方差:
B、含义:
标准差:用来度量随机变量和其数学期望(即均值)之间的偏离程度。
方差:用来度量随机变量和其数学期望(即均值)之间的偏离程度。
协方差:衡量两个变量之间的变化方向关系。
4、np.where——np.where函数是三元表达式x if condition else y的矢量化版本
(1)arr1 = np.array([-1.1,-1.2,-1.3,-1.4,-1.5])
arr2 = np.array([-2.1,-2.2,-2.3,-2.4,-2.5])
condition = (arr1
result2 = np.where(condition, arr1, arr2) #适合任何维度
print(‘使用python语法,结果为:’, result1,’;数据类型为:’, type(result1))
print(‘使用np.where语法,结果为:’, result2,’;数据类型为:’, type(result2))
输出结果:
使用python语法,结果为: [-2.1, -2.2, -2.3, -2.4, -2.5] ;数据类型为:
使用np.where语法,结果为: [-2.1 -2.2 -2.3 -2.4 -2.5] ;数据类型为:
(2)arr3 = np.array([
[1, 2, np.nan, 4],
[4, 5, 6, np.nan],
[7, 8, 9, np.inf],
[np.inf, np.e, np.pi, 4]
])
condition = np.isnan(arr3)|np.isinf(arr3)
print(arr3)
print(np.where(condition, 0, arr3))
运行结果:
[[1. 2. nan 4. ]
[4. 5. 6. nan]
[7. 8. 9. inf]
[ inf 2.71828183 3.14159265 4. ]]
[[1. 2. 0. 4. ]
[4. 5. 6. 0. ]
[7. 8. 9. 0. ]
[0. 2.71828183 3.14159265 4. ]]
5、np.unique——np.unique函数的主要作用是将数组中的元素进行去重操作(也就是只保存不重复的数据)
(1)arr1 = np.array([‘a’, ‘b’, ‘c’, ‘a’, ‘d’, ‘c’, ‘e’])
arr2 = np.unique(arr1)
print(‘原始数据:’, arr1)
print(‘去重之后的数据:’, arr2)
运行结果:
原始数据: [‘a’ ‘b’ ‘c’ ‘a’ ‘d’ ‘c’ ‘e’]
去重之后的数据: [‘a’ ‘b’ ‘c’ ‘d’ ‘e’]