import numpy as py
xxxxxxxxxx# 一维数组arr=np.array([1,3,5,7])[1,3,5,7]# 二维数组arr = np.array([[1,3,5,7],[2,4,6,8]])[[1 3 5 7][2 4 6 8]]
xxxxxxxxxx# 生成指定范围内的数组(一维)arr = np.arange(1,10,2) # 左闭右开,步长为2,如果省略步长,则默认步长为1[1 3 5 7 9]arr=np.arange(10) # 左闭右开,默认步长为1,默认从0开始[0 1 2 3 4 5 6 7 8 9]
xxxxxxxxxxarr= np.zeros(3) # 一维[0. 0. 0.]arr= np.zeros((3,2)) # 二维[[0. 0.][0. 0.][0. 0.]]
xxxxxxxxxxarr= np.ones(3) # 一维[1. 1. 1.]arr= np.ones((3,2)) # 二维,输入元组[[1. 1.][1. 1.][1. 1.]]
对角线的值全为1,其余的全为0(零)。
xxxxxxxxxxarr= np.eye(3)[[1. 0. 0.][0. 1. 0.][0. 0. 1.]]
随机数据生成主要用到的是Numpy中的random模块。
xxxxxxxxxxarr = np.random.rand(3) # 一维[0.8030708 0.78286303 0.50264369]arr = np.random.rand(3,2) # 二维[[0.66689524 0.84930252][0.38527899 0.54416742][0.77398462 0.93349523]]
np.random.random(size = (2,2)) 等价于 np.random.random(size = (2,2))
xxxxxxxxxxnp.random.random(size = (2,2))[[ 0.25303772 0.45417512][ 0.76053763 0.12454433]]
以0为均值、以1为标准差的正态分布(mean=0, stdev=1),,记为N(0,1)
xxxxxxxxxxarr = np.random.randn(5) # 一维[-0.47447338 -1.20679413 1.44442981 -1.00593146 0.68298953]arr = np.random.randn(3,5) # 二维[[0.05393455 0.96485719 0.81191989 0.472052 0.85951346][0.14284396 0.1326059 0.56438413 0.75216161 0.72776451][0.56635746 0.76994301 0.39844886 0.25972326 0.44945312]]
xxxxxxxxxxnp.random.randint(low, high=None, size=None, dtype=int)
xxxxxxxxxxarr=np.random.randint(1,10,10) # 在区间[1,10)生成10个随机数[4 1 2 8 2 6 4 7 2 6]arr=np.random.randint(10,size=10) # 在区间[0,10)生成10个随机数[7 2 5 9 5 8 2 6 8 3]arr=np.random.randint(10,size=(2,3)) # 在区间[0,10)生成随机数二维(2,3)[[2 3 7][5 8 3]]np.random.randint(2, size=10)[1, 0, 0, 0, 1, 1, 0, 0, 1, 0]
xxxxxxxxxxnp.random.choice(a, size=None, replace=True, p=None)
从数列a中随机选择size个元素,replace为True表示选出的元素允许重复。p为元素被选中的概率数列
a可以是一个数组,也可以是一个整数。
xarr=np.random.choice([1,2,3,4,5],3) # 从数组[1,2,3,4,5]中随机取出3个[4 1 2]arr=np.random.choice([1,2,3,4,5],(2,3)) # 从数组[1,2,3,4,5]中随机取出二维数组(2,3)[[1 2 4][1 3 2]]arr=np.random.choice(5,3) # 从[0,5)中随机取出3个[0,4,2]arr=np.random.choice(5,(2,3)) # 从[0,5)中随机取出二维数组(2,3)[[2 1 2][0 1 3]]
根据数组a的第1轴(也就是最外层的维度)进行随排列,改变数组x
xxxxxxxxxxarr = [1,2,3,4,5,6,7,8,9]# arr = np.random.shuffle(arr) # 错误写法,返回Nonenp.random.shuffle(arr) # 正确写法[4, 9, 6, 5, 3, 2, 7, 1, 8]
根据数组a的第1轴产生一个新的乱序数组,不改变数组x
xxxxxxxxxxarr=np.array([1,2,3,4,5])arrNew = np.random.permutation(arr)print(arr)[1,2,3,4,5]print(arrNew)[2 1 5 4 3]
xxxxxxxxxxnumpy.random.uniform(low,high,size)
xxxxxxxxxxnp.random.uniform(1,10,5)[2.28565255, 4.72959013, 2.84071081, 1.84718753, 9.08506286]np.random.uniform(1,10)4.3275659408551235
对于同一个s,生成的随机数相同
产生具有正态分布的数组,loc均值,scale标准差,size形状
xxxxxxxxxxnp.random.normal([loc, scale, size])
xxxxxxxxxxnp.random.standard_normal([size])
xxxxxxxxxxarr= np.array([1,2,3])(3,)arr= np.array([[1,2,3],[4,5,6]])arr.shape(2, 3)
xxxxxxxxxxarr= np.array([[1,2,3],[4,5,6]])arr.size6
xxxxxxxxxxarr= np.array([[1,2,3],[4,5,6]])arr.ndim2
Numpy中数组的元素位置的索引是从0开始的。
如果要从末尾开始取值,传入负数。例如-1表示末尾最后一个。
xxxxxxxxxxarr = np.array([1,2,3,4,5,6,7,8,9])arr[0] # 返回11# 获取末尾最后一个数arr[-1] # 返回99# 获取位置3到6的值,不包含6arr[3:6][4 5 6]# 获取位置3以后所有元素arr[3:][4 5 6 7 8 9]# 获取从第3位置到倒数第2位的元素,不包含倒数第2位arr[3:-2][4 5 6 7]# 传入某个条件arr[arr>3][4, 5, 6, 7, 8, 9]
行,列的位置索引都是从0开始
xxxxxxxxxxarr= np.array([[1,2,3],[4,5,6],[7,8,9]])[[1 2 3][4 5 6][7 8 9]]# 取一个arr[1,1]5# 取一行arr[1] # 第2行[4, 5, 6]# 取一列arr[:,1] # 第2列[2, 5, 8]# 取第1到3列,不包含第3例arr[:,0:2][[1, 2],[4, 5],[7, 8]]# 取第2行之后,第2列之后arr[1:,1:][[5, 6],[8, 9]]
int 整形数,即整数
float 浮点数,即小数点
object Python对象类型
string_ 字符串类型,经常用S表示,S10表示长度为10的字符串。
unicode_ 固定长度的unicode类型,常用 U表示。
xxxxxxxxxxarr= np.array([[1,2,3],[4,5,6]])arr.dtypedtype('int32')
xxxxxxxxxxarr1 = np.arange(10)[0 1 2 3 4 5 6 7 8 9]arr1.dtypedtype('int32')# 将arr1数组从int类型转换为float类型arr2=arr.astype(np.float)[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]arr2.dtypedtype('float64')
分两步:第一步判断是否含有缺失值,第二步,缺失值的填充。
查找缺失值的方法是isnan()函数,在Numpy中缺失值用np.nan表示
xxxxxxxxxxarr=np.array([1,2,3,np.nan,5,6])[ 1. 2. 3. nan 5. 6.]# 判断是否缺失值np.isnan(arr)[False, False, False, True, False, False]# 缺失值填充0arr[np.isnan(arr)]=0[1. 2. 3. 0. 5. 6.]
xxxxxxxxxxarr=np.array([1,2,3,4,3,4])arr=np.unique(arr)[1 2 3 4]
xxxxxxxxxxarr1= np.arange(10)[0 1 2 3 4 5 6 7 8 9]arr2 = arr.reshape(2,5)[[0 1 2 3 4][5 6 7 8 9]]
将数组的行转为列,列转为行。
xxxxxxxxxxarr1= np.array([[0, 1, 2, 3],[ 6, 7, 8, 9]])[[1 2 3][7 8 9]]arr2 = arr1.T[[1 7][2 8][3 9]]
xxxxxxxxxxarr=array([[1,2],[3,4],[5,6]])[[1 2][3 4][5 6]]arr2 = arr.flatten() # 默认按行的方向降维arr2 = arr.flatten("A") # 按行降维array([1 2 3 4 5 6])arr.flatten('F') #按列降维array([1, 3, 5, 2, 4, 6])
xxxxxxxxxxarr = np.mat([[1,2,3],[4,5,6]])matrix([[1, 2, 3, 4, 5, 6]])arr.flatten()matrix([[1, 2, 3, 4, 5, 6]])arr.flatten().A # 将矩阵转化为数组array([[1, 2, 3, 4, 5, 6]])
xxxxxxxxxxarr=[[1,2],[3,4],[5,6]][y for x in arr for y in x][1, 2, 3, 4, 5, 6]
横向合并就是将两个行数相等的数组在行方向上进行简单拼接。与DateFrame合并不一样,Numpy数组合并不需要公共列,只是将两个数组简单的拼接在一起,有三种方法:concatanate、hstck、column_stack
xxxxxxxxxxarr1= np.array([[1,2,3],[4,5,6]])arr1= np.array([[7,8,9],[10,11,12]])
xxxxxxxxxx# axis=1表示在行方向上进行合并arr=np.concatenate([arr1,arr2],axis=1)[[ 1 2 3 7 8 9][ 4 5 6 10 11 12]]
xxxxxxxxxxarr=np.hstack((arr1,arr2)) # 传参以元组形式[[ 1 2 3 7 8 9][ 4 5 6 10 11 12]]
xxxxxxxxxxarr=np.column_stack((arr1,arr2)) # 传参以元组形式[[ 1 2 3 7 8 9][ 4 5 6 10 11 12]]
纵向合并与横向合并类似,也有三种方法:concatanate、vstack、row_stack
xxxxxxxxxxarr=np.concatenate([arr1,arr2],axis=0)[[ 1 2 3][ 4 5 6][ 7 8 9][10 11 12]]
xxxxxxxxxxarr=np.vstack((arr1,arr2))[[ 1 2 3][ 4 5 6][ 7 8 9][10 11 12]]
xxxxxxxxxxarr=np.row_stack((arr1,arr2))[[ 1 2 3][ 4 5 6][ 7 8 9][10 11 12]]
NumPy 算术函数包含简单的加减乘除: add(),subtract(),multiply() 和 divide()。
需要注意的是数组必须具有相同的形状或符合数组广播规则。
1. 定义:
概括地说,两个向量的外积,又叫叉乘、叉积向量积,其运算结果是一个向量而不是一个标量。并且两个向量的外积与这两个向量组成的坐标平面垂直。
2. 几何意义:
(1)在三维几何中,向量a和向量b的外积结果是一个向量,有个更通俗易懂的叫法是法向量,该向量垂直于a和b向量构成的平面。
(2)在二维空间中,外积还有另外一个几何意义就是:|a×b|在数值上等于由向量a和向量b构成的平行四边形的面积。
例1:
xxxxxxxxxxa = [1 2]b = [3 4]a*b = [3 8]
例2:
xxxxxxxxxx# 广播机制a = np.array([[1,2],[5,6]])b = np.array([10,10]) # 广播为[[10,10],[10,10]]arr = np.multiply(a,b) # 另一种写法arr = a*b[[10 20][50 60]]
| 函数 | 描述 |
|---|---|
dot | 两个数组的点积,即元素对应相乘。(2,3)X(3,2)=(2,2) |
vdot | 两个向量的点积 |
inner | 两个数组的内积 |
matmul | 两个数组的矩阵积 |
determinant | 数组的行列式 |
solve | 求解线性矩阵方程 |
inv | 计算矩阵的乘法逆矩阵 |
概括地说,向量的内积(点乘/数量积)。对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作。
几何意义:
(1)表征或计算两个向量之间的夹角
(2)b向量在a向量方向上的投影
(3)公式 a•b = |a||b|cosθ
一维数组的点积就是计算两个数组对应位置乘积之和。计算公式为a[0] * b[0] +a[1] * b[1 +...+a[n]*b[n]
二维数组的点积相对复杂一些,假如有数组A和数组B他们都是两行两列,则点积计算结果也为两行两列的一个数组,假设点积数组为C,计算公式如下。
C[0,0]=A[0,0] *B[0,0] + A[0,1] *B[1,0]:A的第一行与B的第一列,对应元素的乘积之和;
C[0,1]=A[0,0] *B[0,1] + A[0,1] *B[1,1]:A的第一行与B的第二列,对应元素的乘积之和;
C[1,0]=A[1,0] *B[0,0] + A[1,1] *B[1,0]:A的第二行与B的第一列,对应元素的乘积之和;
C[1,1]=A[1,1] *B[0,1] + A[1,1] *B[1,1]:A的第二行与B的第二列,对应元素的乘积之和;
例1
xxxxxxxxxx# 一维a = np.array([1,2,3])b = np.array([5,6,7])arr = np.dot(a,b)38 # 38=1*5+2*6+3*7
例2
xxxxxxxxxx# 二维a = np.array([[1,2],[3,4]])b = np.array([[11,12],[13,14]])print(np.dot(a,b))[[37 40][85 92]]#计算过程 [[1*11+2*13, 1*12+2*14],[3*11+4*13, 3*12+4*14]]
主要是针对数组中的每一个元素执行相同的操作。
xxxxxxxxxxarr=np.arange(10)np.square(arr) # 平方array([ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81], dtype=int32)np.sqrt(arr) # 平方根array([0. , 1. , 1.41421356, 1.73205081, 2. ,2.23606798, 2.44948974, 2.64575131, 2.82842712, 3. ])
xxxxxxxxxxarr= np.array([[1,2,3],[4,5,6],[7,8,9]])print(arr)[[1 2 3][4 5 6][7 8 9]]# 整个数组求和np.sum(arr)45# 对数组的每一行求和np.sum(arr,axis=1)[ 6, 15, 24]# 对数组的每一列求和np.sum(arr,axis=0)[12, 15, 18]# 对数组的每一行求均值np.mean(arr,axis=1)[2., 5., 8.]# 对数组的每一列求均值np.mean(arr,axis=0)[4., 5., 6.]# np.maximum:(X, Y, out=None)函数np.maximum([-2, -1, 0, 1, 2], 0)array([0, 0, 0, 1, 2])
参数:np.where(条件,真,假) ,类似Excel中的if函数
xxxxxxxxxxarr = np.array([55,66,77])np.where(arr>60,"合格","不合格")['不合格', '合格', '合格'], dtype='<U3'np.where(arr>60)array([1, 2], dtype=int64)
主要有包含、交集、并集、差集四种。
xxxxxxxxxxarr1=np.array([1,2,3,4])arr2=np.array([1,2,5])# 包含# np.in1d(arr1,arr2)[ True, True, False, False]# 交集np.intersect1d(arr1,arr2)[1, 2]# 并集np.union1d(arr1,arr2)[1, 2, 3, 4, 5]# 差集np.setdiff1d(arr1,arr2)[3, 4]