一、创建ndarray
*ndarray是NumPy中表示数组的重要类型
1、使用np.array()创建
*参数列表:[1,2,3,4]
注:(1)、numpy默认ndarray的所有元素的类型是相同的 (2)、如果传入的数据类型不同,会被按照优先级强制转换为同一类型,其中优先级为 str >float >int (3)、ndarray常见的数据类型:int: int8、uint8、int16、int32、int64float:float16、float32、float64str:字符串
a = [1,2,3,4,5] n = np.array(a) print(n) #显示类型 print(type(n)) #显示形状 print(n.shape)
2、使用np的routines函数创建
(1)、np.ones(shape,dtype = None,order = 'C')
*创建一个所有元素都为1的多维数组
参数说明:
-
shape:形状
-
dtype=None,元素类型
order:{‘C’,‘F’},可选,默认值:C是否在内存中以行主或列主顺序存储多维数据,一般默认
n = np.ones(shape=(3,),dtype = np.int8)
(2)、np.zeros(shape,dtype = float,order = 'C')
*创建一个所有元素都为0的多维数组
参数说明:
-
*shape:形状
-
*dtype = None:元素类型
n = np.zeros(shape = (5,5),dtype = np.int16)
(3)、np.full(shape,fill_value,dtype = None,order = 'C')
*创建一个所有元素都为指定元素的多维数组
参数说明:
-
*shape:形状
-
*fill_value:填充值
-
*dtype = None:元素类型
n = np.full(shape = (3,4),fill_value = 8)
(4)、np.eye(N,M=None,k=0,dtype=float)
*对角线为1其他位置为0的二维数组
参数说明:
-
*N:行数
-
*M:列数,默认为None,表示和行数一样
-
*k :主对角线向右偏移的位置
-
*dtype = None:元素类型
n = np.eye(9,9,k=3)
(5)、np.linspace(start,stop,num = 50,endpoint = True,restep = False,dtype = None)
*创建一个等差数列
参数说明:
-
start:开始值
-
stop:结束值
-
num= 50:等差数列中默认有50个数
-
endpoint = True:是否包含结束值
-
restep = False:是否返回等差值(步长)
-
dtype = None:元素类型
n = np.linspace(1,9,5) print(n)
(6)、np.arange(start,stop,step,dtype = None)
*创建一个数值范围的数组
*和Python中range功能类似
参数说明:
start:开始值
stop:结束值(不包含)
step:步长
dtype = None:元素类型
n = np.arange(2,10,2) print(n)
(7)、np.random.randint(low,high = None,size = None,dtype = None)
*创建一个随机整数的多维数组
参数说明:
-
low:最小值
-
high:None:最大值
-
-
注:high=None时,生成的数值在(0,low)之间
-
如果使用high这个值,则生成的数值在(low,high)之间
-
-
size = None:数组形状,默认只输出一个随机值
-
dtype = None:元素类型
#随机整数:单个数 n = np.random.randint(3,10) print(n) #随机整数:一维数组 n = np.random.randint(3,10,size=6) print(n) #随机整数:二维数组 n = np.random.randint(3,10,size=(3,4)) print(n) #随机整数:三维数组 n = np.random.randint(0,256,size=(20,40,3)) print(n)
(8)、np.random.randn(d0,d1,......,dn)
*创建一个服从标准正态分布的多维数组
*创建一个所有元素都为1的多维数组
参数说明:
-
dn:第n个维度的值
n = np.random.randn(1,2,3) print(n)
(9)、np.random.normal(loc = 0.0,scale = 1.0,size = None)
*创建一个服从正态分布的多维数组
参数说明:
-
loc:均值
-
scale:标准差,对应分布的宽度,scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦
-
size = None:数组形状
n = np.random.normal(10,0.5,size=(3,4)) print(n)
(10)、np.random.random(size = None)
*创建一个元素为0~1(左闭右开)的随机数的多维数组
参数说明:
-
size= None:数组形状
n = np.random.random(size=(3,4)) print(n)
(11)、np.random.rand(d0,d1,......,dn)
*同np.random.random(size = None)
*创建一个元素为0~1(左闭右开)的随机数的多维数组
参数说明:
-
dn:第n个维度的数值
n = np.random.rand(3,4) print(n)
二、ndarray的属性
1、ndim(维度)
n = np.random.rand(3,4) print(n) w = n.ndim print(w)
2、shape(形状)
*三个数字分别表示各个维度的长度
n = np.random.rand(3,4) print(n) w = n.ndim print(w) x = n.shape print(x)
3、size(总长度)
*即:行和乘列和
n = np.random.rand(3,4) print(n) w = n.ndim print(w) x = n.shape print(x) c = n.size print(c)
4、dtype(元素类型)
n = np.random.rand(3,4) print(n) w = n.ndim print(w) x = n.shape print(x) c = n.size print(c) l = n.dtype print(l)
三、ndarray的基本操作
1、索引
一维和列表索引的操作一致。
2、 根据索引修改数据
(1)、将第二行全部数字改为0.88
n= np.random.rand(3,4) print(n) #将第二行全部数字改为0.88 n[1]=0.88 print(n)
(2)、将第二行最后一个数改为0.88
a= np.random.rand(3,4) print(a) #将第二行最后一个数改为0.88 a[1][3]=0.88 print(a)
3、切片
import numpy as np #列表有逗号间隔 # I = [1,2,3,4,5,6,7,8] # a = I[2:6] # b = I[::-1] #翻转 # print(a) # print(b) # #数组没有逗号间隔 # n = np.array(I) # a = n[2:6] # print(n) # print(a)#对于二维数组的行切片 n = np.random.randint(0,10,size=(6,8)) # #取一行 # print(n[0]) # #连续取多行 # print(n[1:4]) # #取不连续多行 # print(n[[1,2,4]])#对于二维数组的列切片 n = np.random.randint(0,10,size=(6,8)) print(n) #取一列 print(n[:,0]) #取第一列 print(n[1:4,0]) # 取第二到第四行的第一列 #取连续的多列:切片 print(n[:,2:5]) #取第三到第五列的所有行 #取不连续的多列:中括号 print(n[:,[1,3,4]]) #取第二列和第四列和第五列的所有行
4、翻转
(1)、行翻转
n[::-1]
(2)、列翻转
n[:,::-1]
5、变形
使用reshape函数
import numpy as npn = np.arange(1,21) print(n)#reshape:将数组改变形状 变成二维 a = np.reshape(n,newshape=(4,5)) print(a)#使用-1:表示任意剩余维度长度 e = n.reshape(4,-1) print(e) r = n.reshape(-1,2) print(r)
6、级联(合并)
#级联(合并) a = np.concatenate((n1,n2)) #上下合并 print(a)l = np.concatenate((n1,n2),axis=0) #上下合并 print(l)p = np.concatenate((n1,n2),axis=1) #左右合并 print(p)#左右合并 i = np.hstack((n1,n2)) print(i)#上下合并 u = np.vstack((n1,n2)) print(u)
7、拆分
(1)、np.split()
(2)、np.hsplit()
(3)、np.vsplit()
import numpy as npn = np.random.randint(0,100,size=(4,4)) print(n) a = np.split(n,4) print(a) b = np.hsplit(n,4) print(b) #垂直拆分,平均拆成3份 c = np.vsplit(n,4) print(c) #按照指定位置拆分 d = np.vsplit(n,(1,2,4)) print(d) #水平拆分 e = np.hsplit(n,4) print(e) print() #split:做水平和垂直拆分 #axis = 0:行 #axis = 1:列 a = np.split(n,4) a = np.split(n,4,axis=0) print(a) print() m = np.split(n,4) m = np.split(n,4,axis=1) print(m)
8、拷贝
import numpy as np#n2不会随着n的变化而变化 n = np.random.randint(0,10,size=(2,3)) n2 = n.copy() n[0][0] = 0 print(n2) print(n)#注:如果用n3 = n,则n2会随着n的变化而变化 n3 = n print(n3)
四、numpy的聚合操作
1、求和np.sum()
import numpy as npn = np.arange(10) print(n)s = np.sum(n) print(s)n = np.random.randint(0,10,size=(3,5)) print(n) s1 = np.sum(n) print(s1) #全部数加起来 s2 = np.sum(n,axis=0) print(s2) #表示每一列的多行求和 s3 = np.sum(n,axis=1) print(s3) #表示每一行的多列求和
2、最小值np.min
3、最大值np.max
4、平均值np.mean
5、平均值np.average
6、中位数np.median
7、百分位数np.percentile
8、最小值对应的下标np.argmin
9、最大值对应的下标np.argmax
10、标准差np.std
11、方差np.var
12、次方,求幂np.power
13、按条件查找np.argwhere
14、np.nansum
-
*nan:数值类型,not a number:不是一个正常的数值,表示空
-
*np.nan:float类型
#对于含有空的数组,要用np.nansum进行求和 n = np.array([1,2,3,np.nan]) print(n) #实质是去掉空值后的数组进行求和 s4 = np.nansum(n) print(s4)
五、矩阵操作
1、基本的矩阵操作
算术运算符:加减乘除
矩阵和矩阵之间运算
数与矩阵运算
2、矩阵乘积
np.dot(第一个矩阵的列数等于第二个矩阵的行数)
import numpy as npn1 = np.random.randint(0,10,size=(4,4)) n2 = np.random.randint(0,10,size=(4,5)) print(n1,n2) print() n3 = np.dot(n1,n2) print(n3)
3、矩阵的逆
n4 = np.linalg.inv(n2) print(n4)
4、行列式的计算
n5 = np.round(np.linalg.det(n1)) print(n5)
5、矩阵的秩
n6 = np.linalg.matrix_rank(n1) print(n6)
六、ndarray的广播机制
(1)、为缺失的维度补维度
(2)、缺失元素用已有的数组填充
import numpy as npx = np.full(shape=(3,3),fill_value=2) print(x) y = np.arange(3) print(y) z = x+y print(z) #注:第二个数组会自动补上两行[0 1 2],然后在进行相加
七、数学操作
import numpy as npn = np.array([1,2,3,5,5,44,55,66])#绝对值 print(np.abs(n)) #平方根 print(np.sqrt(n)) #平方 print(np.square(n)) #指数 print(np.exp(n)) #自然对数 print(np.log(n)) #以2为底的对数 print(np.log2(n)) #以10为底的对数 print(np.log10(n)) #正弦函数 print(np.sin(n)) #余弦函数 print(np.cos(n)) #正切函数 print(np.tan(n)) #向上取整 print(np.ceil(n)) #四舍五入 print(np.round(n,2)) #向下取整 print(np.floor(n)) #累加 print(np.cumsum(n))
八、ndarray的排序
1、np.sort()
不改变输入
import numpy as npn = np.array([55,44,8,2,9,7,3,6]) print(np.sort(n)) print()
2、ndarray.sort()
本地处理,不占用空间,但不改变输入
import numpy as npn1 = np.random.randint(0,10,size=8) print(n1) n1.sort() print(n1)
九、文件操作
1、保存数组到npy或npz文件
save:保存ndarray到一个npy文件。
savez:将多个array保存到一个npz文件中。
import numpy as npx = np.arange(5) y = np.arange(10,20)np.save('x',x) np.savez('arr.npz',xarr = x,yarr = y)
a = np.load('x.npy') b = np.load('arr.npz')['yarr']print(a) print(b)
2、保存数组到csv或txt文件
n = np.random.randint(0,10,size=(3,4)) #存储到csv或txt #delimiter = ',':分隔符 np.savetxt('arr.csv',n,delimiter=',') #读取csv或txt #注:最新版numpy不能用dtype要用astype c = np.loadtxt('arr.csv',delimiter=',').astype(np.int8) print(c)