numpy默认要求矩阵里面都是相同类型:
array = ([1,2,3,4,'5'])
print(array)
# array(['1','2','3','4','5'],dtype = '
常用:
array.itemsize() # 查看每个元素占了多少个字节
array.size() # 查看里面有多少个元素
array.ndim() # 查看有多少个维度
array.fill(n) # 用n填充矩阵
array = ([1,2,3,4,5])
array2 = array
array2[1] = 10
print(array2) # ([1,10,3,4,5])
print(array) # ([1,10,3,4,5])
array2 = array
并不是创建一个新的地址存储array2,只是让array2指向和array相同的地址,因此修改array2
的值,也会修改array
的值,此时的解决办法为:array2 = array.copy()
np.random.rand(n)
会随机返回n个0-1之间的值,可以根据随机数组random_array返回一个bool类型的矩阵
random_array = np.random.rand(5)
# array([0.56372953,0.13857392,0.48362758,0.84739275,0.937582716])
mask = random_array > 0.5
# array([True,False,False,True,True],dtype = bool)
使用np.where()
来找到想要的值的索引,可以利用该索引来提取想要的值
np.where(array > 3) # array([3,4],dtype = int64)
array[np.where(array >30)] # array([4,5])
常用:
array = ([1,2,3,4,5],dtype = np.float32)
print(array.nbytes()) # 20
# 返回的总共占多少字节 一个float32占4个字节,5个元素一共占20个字节
array = ([1,2,3.5,'str'])
print(array) # array(['1','2','3.5','str']) 会全部返回字符串类型
array = ([1,2,3.5,'str'],dtype = object)
print(array) # array([1,2,3.5,'str']) # object会保持元素原有类型
重新定义矩阵类型:
array = ([1,2,3,4,5])
array2 = np.asarray(array,dtype = np.float32)
print(array2) # array([1.,2.,3.,4.,5.],dtype = float32)
print(array) # array([1,2,3,4,5],dtype = float32)
# 重新定义array类型,并存到一个新的内存array2中,即不会修改原有array的类型
# astype()也可以做到
array.astype(dtype = np.float32)
array.clip(2,4) # ([2,2,3,4,4,4])
#clip(n,m)函数,将小于n的值全部改为n,将大于m的值全部改为m
array = ([1.2,3.4,5.67])
array.round() # [1,3,6] 四舍五入
array.round(decimal = 1) #[1.2,3.4,5.7] 参数decimal决定保留几位小数
array = ([[1,2,3],[4,5,6]])
np.sum(array) # 21
# 或者可以写array.sum()
np.sum(array,axis = 0) # ([5,7,9])
# array(sum,axis = 0)
np.sum(array,axis = 1) # ([6,15])
可以利用axis
指定轴进行计算,对于多维的矩阵,想指定最后一个轴时,可用axis = -1
,除了加法运算,还有一下运算,均可以使用轴来进行运算:
prod()
min()
max()
argmin()
argmax()
mean()
std()
var()
array = ([[1.5,1.3,7.5],[5.6,7.8,1.2]])
np.sort(array) # ([[1.3,1.5,7.5],[5.6,[7.8],[7.5]])
np.sort(array,axis = 0) # ([[1.5,1.3,1.2],[5.6,7.8,7.5]]) 按轴排序
排序索引
np.argsort(array) # ([[1,0,2],[2,0,1]])
array = np.linspace(0,10,10)
# ([0.,1.11111111,2.22222222,3.33333333,4.44444444,5.55555556,6.66666667,7.77777778,8.88888889,10.])
values = np.array([2.5,6.5,9.5])
np.searchsorted(array,values)
# [3,6,9] 按大小顺序返回插入的位置
多条件排序
array = np.array([[1,0,6],[1.7.6],[2.3.1],[2.4.0]])
index = np.lexsort([-1*array[:,0],array[:,2]])
# 在第三列降序的情况下,第一列升序 返回[0,1,3,2]
array[index] = index
# ([[2,4,0],[1,7,0],[2,3,1],[1,0,6]])
array = np.arange(10) # ([0,1,2,3,4,5,6,7,8,9])
print(array,shape) # (10,)
array.shape = 2,5 # ([[0,1,2,3,4],[5,6,7,8,9]])
array.reshape(1,10) # ([[0,1,2,3,4,5,6,7,8,9]])
新增一个维度newaxis
array = np.arange(10) # ([0,1,2,3,4,5,6,7,8,9])
print(array.shape) # (10,)
array = array[:,np.newaxis] # ([[0],[1],[2],[3],[4],[5],[6],[7],[8],[9]])
print(array.shape) # (10,1)
array = array[:,np.newaxis,np.newaxis]
print(array.shape) # (10,1,1,1)
压缩squeeze()
array = array.squeeze() #去掉空轴
print(array.shape) # (10,)
转置transpose()
或T
array.shape = 2,5
array.transpose() #([[0,5],[1,6],[2,7],[3,8],[4,9]])
# 或者array.T ,但此时array的值不会改变,所以要使用转置,必须重新赋值
数组的连接concatenate()
a = np.array([[12,34,23],[32,43,45]])
b = np.array([[35,37,68],[56,58,34]])
c = np.concatenate((a,b))
# 注意两个括号,第一个括号传参数,第二个括号代表元组
# ([[12,34,23],[32,43,45],[35,37,68],[56,58,34]])
c = np.concatenate((a,b),axis = 1)
#([[12,34,23,35,37,68],[32,43,45,56,58,34]])
np.vstack((a,b))# ([[12,34,23],[32,43,45],[35,37,68],[56,58,34]])
np.hstack((a,b))#([[12,34,23,35,37,68],[32,43,45,56,58,34]])
拉平flatten()
或ravel()
a.flatten() #([12,34,23,32,43,45])
a.ravel() #([12,34,23,32,43,45])
arange()
左闭右开
np.arange(10)
np.arange(2,20,2)
linspace()
左开左闭
np.linspace(0,10,50) # 在0-10中随机50个数
logspace()
默认以10为底
np.logspace(0,1,5)
生成x,y的网格meshgrid()
x = linspace(-10,10,5) # ([-10,-5,0,5,10])
y = linspace(-10,10,5) # ([-10,-5,0,5,10])
x, y = meshgrid(x,y)
print(x) #([[-10,-5,0,5,10],[-10,-5,0,5,10],[-10,-5,0,5,10],[-10,-5,0,5,10],[-10,-5,0,5,10]])
print(y) #([[-10,-5,0,5,10],[-10,-5,0,5,10],[-10,-5,0,5,10],[-10,-5,0,5,10],[-10,-5,0,5,10]])
构造行向量、列向量
np.r_[0:10:1] # 行向量([0,1,2,3,4,5,6,7,8,9])
np.c_[0:10:1] # 列向量([[0],[1],[2],[3],[4],[5],[6],[7],[8],[9]])
更常用的zeros()
、ones()
、empty()
np.zeros(3) # ([0.,0.,0.])
np.zeros((3,3)) # ([[0.,0.,0.],[0.,0.,0.],[0.,0.,0.]])
np.ones((3,3)) # ([[1.,1.,1.],[1.,1.,1.],[1.,1.,1.]])
a = np.empty(5) # 随机
a.fill(1) #([1.,1.,1.,1.,1.])
a = np.array([1,2,3,4])
b = np.zeros_like(a) # ([0,0,0,0]) 只复制shape
np.identity(3) #构造单位函数 ([1,0,0],[0,1,0],[0,0,1])
运算必须保证维度相同
x = np.array([5,5])
y = np.array([2,2])
np.multiply(x,y) #([10,10]) 对应位置进行相乘
np.dot(x,y) # 20 = 2*5+2*5 内积
x.shape = 2,1
y.shape = 1,2
np.dot(x,y) #([[10,10],[10,10]])
np.dot(y,x) #([[20]])
逻辑运算
x = np,array([1,1,1,4])
y = np,array([1,1,1])
x == y # 维度不一样报错
y = np,array([1,1,1,2])
x == y #([True,True,Ture,False])
np.logical_and(x,y) #([True,True,Ture,True]) 返回逻辑and
np.logical_or(x,y) #([True,True,Ture,True]) 返回逻辑or
np.logical_not(x,y) #([0,0,0,0]) 返回逻辑not
np.random.rand(3,2) #构造从0-1的shape为3,2的矩阵
np.random.randint(10,size=(5,4)) #构造5,4的0-10的随机矩阵 左闭右开
np.random.random_sample()
np.random.randint(0,10,3) # 在0-10中随机选择3个数
mu, sigma = 0,0.1
np.random.normal(mu,sigma,10) # 高斯分布随机10个数
np.set_printoptions(precision = 3) # 设置浮点的精度,即输出3为小数
洗牌shuffle()
array = np.arange(10)
np.random.shuffle(array) # 打乱array的顺序
随机种子seed()
np.random.seed(0)
mu, sigma = 0,0.1
np.random.normal(mu,sigma,10)
# 指定随机的种子后,无论执行多少次np.random.normal(mu,sigma,10) 值都不会变,只有当修改seed里面的参数时,才会改变
#首先写个文件
%%writefile tang.txt
1 2 3 4 5 6
2 3 5 8 7 9
data = []
with open('tang.txt') as f:
for line in f.readlines():
fileds = line.split()
cur_data = [float(x) for x in fileds]
data.append(cur_data)
data = np.array(data) #([[1.,2.,3.,4.,5.,6.],[2.,3.,5.,8.,7.,9.]])
data = np.loadtxt('tang.txt') #([[1.,2.,3.,4.,5.,6.],[2.,3.,5.,8.,7.,9.]]) 若数据比较规整,可以直接使用loadtxt
%%writefile tang2.txt
1,2,3,4,5,6
2,3,5,8,7,9
data = np.loadtxt('tang2.txt') #报错,无法转为浮点型,需要指定分隔符
data = np.loadtxt('tang2.txt',delimiter = ',') #默认为空格
%%writefile tang2.txt
x,y,z,w,d,s
1,2,3,4,5,6
2,3,5,8,7,9
data = np.loadtxt('tang2.txt',delimiter = ',',skiprows = 1) #skiprows去掉第一行
skiprows:去掉几行
delimiter = ‘,’ :以,为分隔符
usecols = (0,1,4) :指定使用哪几列
array = np.array([[1,2,3],[4,5,6]])
np.savetxt 'tang4.txt',array.fmt = '%d',delimiter = ','#fmt为指定数据类型fmt = '%.2f'
读写array结构
array = np.array([[1,2,3],[4,5,6]])
np.save('tang5.npy',array)
tang = np.load('tang5.npy')
print(tang) # ([[1,2,3],[4,5,6]])
#保存多个array,会保存成一个压缩文件npz,里面有多个npy
array1 = np.arange(10)
np.savez('tang.npz',a = array,b = array1)
data = np.load('tang.npz')
data.keys() # ['b','a']
data['a'] #([[1,2,3],[4,5,6]])
1、打印当前numpy版本
print(np.__version__)
2、打印3,3零矩阵,并输出其占用的内存
arr2 = np.zeros((3,3))
print(arr2,arr2.nbytes)
print('%d bytes'% (arr2.size * arr2.itemsize))
3、np的帮助文档
print(help(np.info(np.add)))
4、返回数组10-49,且为降序
arr4 = np.arange(10,50,1)
arr4 = arr4[::-1]
print(arr4)
5、找到一个数组中不为0的索引
arr5 = np.nonzero([1,34,654,8,0,467,0,579,0,50,0,0])
print(arr5)
6、3*3矩阵 打印最大值、最小值
arr6 = np.array([[235,3674,345,457],[34,57,3,647]])
print(arr6)
print(arr6.max(),arr6.min())
7、5,5矩阵,外圈加一圈0,pad()函数
arr7 = np.ones((5,5))
arr7 = np.pad(arr7,pad_width = 1,mode = 'constant',constant_values = 0)
print(arr7)
8、shape=6,7,8的矩阵,返回第100个元素的索引
print(np.unravel_index(100,(6,7,8)))
9、5,5矩阵归一化
arr8 = np.random.random((5,5))
arr8 = (arr8-arr8.min())/(arr8.max()-arr8.min()) #归一化
print(arr8)
10、找到两个数组中相同的值
arr9 = np.random.randint(0,10,10)
arr10 = np.random.randint(0,10,10)
print(arr9)
print(arr10)
print(np.intersect1d(arr10,arr9))
11、得到昨天、今天、明天
yesterday = np.datetime64('today','D') - np.timedelta64(1,'D')
today = np.datetime64('today','D')
tommorow = np.datetime64('today','D') + np.timedelta64(1,'D')
print(yesterday,today,tommorow)
12、得到一个月所有的天
arr11 = np.arange('2022-03','2022-04',dtype = 'datetime64[D]')
print(arr11)
13、得到一个数的整数部分
arr12 = np.random.uniform(0,10,10)# 0-10选10个数
print(arr12)
arr12 = np.floor(arr12)# round()四舍五入,floor()向下取整
print(arr12)
14、构造一个不能背改变的数组
arr13 = np.zeros(5)
arr13.flags.writeable = False
15、打印一个很大的数据的部分值,全部值
np.set_printoptions(threshold=np.nan)# 打印全部
arr14 = np.zeros((15,15))
print(arr14)
np.set_printoptions(threshold=5)# 只打印5行
arr14 = np.zeros((15,15))
print(arr14)
16、在数组中,找到最接近数的索引
arr15 = np.arange(100)
v = np.random.uniform(0,100)
print(v)
index = (np.abs(arr15-v)).argmin()
print(index)
'''
93.2285873444004
93
'''
17、float32和int32的转换
arr16 = np.arange(10,dtype = np.int32)
arr16 = arr16.astype(np.float32)
print(arr16.dtype)
18、打印数组元素位置坐标与数值
arr17 = np.arange(9).reshape(3,3)
for index,value in np.ndenumerate(arr17):
print(index,value)
'''
(0, 0) 0
(0, 1) 1
(0, 2) 2
(1, 0) 3
(1, 1) 4
(1, 2) 5
(2, 0) 6
(2, 1) 7
(2, 2) 8
'''
19、按某一列排序
arr18 = np.random.randint(0,10,(3,3))
print(arr18)
print(arr18[arr18[:,1].argsort()])
'''
[[6 7 7]
[6 8 5]
[6 4 0]]
[[6 4 0]
[6 7 7]
[6 8 5]]
'''
20、统计有多少个重复值
arr19 = np.random.randint(1,10,10)
print(arr19)
print(np.bincount(arr19)) # 统计arr19里分别有多少个,从0-最大值
# [9 8 3 3 9 4 3 7 7 3]
# [0 0 0 4 1 0 0 2 1 2]
21、四维矩阵,以最后两维求和
arr20 = np.random.randint(0,20,(4,4,4,4))
print(arr20.sum(axis = (-2,-1)))
22、矩阵交换两行顺序
a rr21 = np.arange(25).reshape(5,5)
arr21[[0,1]] = arr21[[1,0]]
23、数组中最常出现的数
arr22 = np.random.randint(0,10,20)
print(np.bincount(arr22).argmax())
24、快速查找TOP K
arr23 = np.arange(10000)
np.random.shuffle(arr23)
n = 5
print(arr23[np.argpartition(-arr23,n)[:n]])
# [9999 9998 9996 9997 9995]
25、去掉一个数组中,所有元素都相同的数据
arr24 = np.random.randint(0,3,(10,3))
print(arr24)
e = np.all(arr24[:,1:] == arr24[:,:-1],axis = 1)# 还有一个any
# all限制所有元素相同,any只要有元素相同
print(e)