import numpy as np
引入假如我们想将列表中的每个元素增加1,但列表不支持这样的操作:
a=[1,2,3,4] [i+1 for i in a] want to get:[2, 3, 4, 5]
与另一个数相加,得到对应元素相加的结果:
a=[1,2,3,4] b=[2,3,4,5] [x+y for (x,y) in zip(a,b)] want to get:[3,5,7,9]
这样的操作比较麻烦,而且在数据量特别大的时候会非常耗时间。
如果我们使用Numpy,就会变得特别简单
a=np.array([1,2,3,4,5]) print(a+1) #[2 3 4 5 6] b=np.array([2,3,4,5]) print(a+b) #[ 4 6 8 10]常用方法 产生数组array
生成数组
通过方法np.array(dtype=‘’)去生成数组
a=np.array([1,2,3,4,5])
dtype='object’时,可以各种类型都存在,但是不利于后续操作
生成全0或全1数组
a=np.zeros(5) #生成全0
a=np.ones(5,dtype='bool') #dtype设置数据类型 print(a) #[ True True True True True]
np.zeros_like(array):生成与array结构相似的全0矩阵
np.ones_like(array):
fill方法
可以使用fill方法将数组设定为指定值
与列表不同,数组中要求所有元素的dtype是一样的,如果传入参数的类型与数组类型不一样,需要按照已有的类型进行转换。
a=np.array([1,2,3,4]) a.fill(2.5) ##传入的参数类型会按照原数组类型进行转换 a #array([2, 2, 2, 2])
##使用fill方法将原数组类型改变
a=np.array([1,2,3,4])
a=a.astype('float')
a.fill(2.5)
a
#array([2.5, 2.5, 2.5, 2.5])
1.生成整数序列 arange
a=np.arange(1,10,2) ##arange(起点,终点,步长) a
2.生成等差数列 linspace
a=np.linspace(1,19,10) ##linspace(起点,终点,个数),此处从1开始到19结束,生成10个元素 a
3.行向量和列向量
行向量 np.r_[0:10] 列向量 np.c_[0:10]数组属性
1.查看类型
a=np.array([1,2,3,4]) type(a)
2.查看数据类型
a.dtype
3.查看形状,会返回一个元组,每个元素代表这一堆的元素数目
a=np.array([[1,2,4],[2,3,4]]) a.shape #(2,3) 两行三列
4.查看数组里面元素的数目
a=np.array([[1,2,4],[2,3,4]]) a.size
5.查看数组维度
a.ndim
6.复制数组**(易错点)**
如果使用array1 = array2 这样的方式,意义为这两个指向同一块内存,所以当array1被修改时,array2也会被修改。
如果想让两个ndarray互不关联,需要采取array1 = array2.copy
7.修改数组的数据类型
array.astype()
多维数组1.数组生成:
a=np.array([[1,2,3,4],[5,6,7,8]]) a
2.索引取值
a[1,3] #8 a[1] #array([5, 6, 7, 8])
a=np.array([[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],[30,31,32,33,34,35],[40,41,42,43,44,45],[50,51,52,53,54,55]])
a
#array([[ 0, 1, 2, 3, 4, 5],
# [10, 11, 12, 13, 14, 15],
# [20, 21, 22, 23, 24, 25],
# [30, 31, 32, 33, 34, 35],
# [40, 41, 42, 43, 44, 45],
# [50, 51, 52, 53, 54, 55]])
#取到第一行的第4和第5两个元素
a[0,3:5]
#得到最后两行的最后两列
a[4:,4:] a[-2:,-2:]
#得到第3列
a[:,2]
#例如:取出3,5行的奇数列
a[2:5:2,::2]
转换类型
1.asarray函数
a=np.array([1,2,3]) np.asarray(a,dtype=float)
2.astype函数
##astype方法返回一个新数组 a=np.array([1,2,3]) a.astype(float)排序
np.sort() :默认最后的一个轴
np.argsort():返回从小到大的排列在数组中的索引位置
np.searchsorted(array,values): 查看values在array中应该大小在哪个位置
np.lexsort([b,a]):先以a进行排序,a相同的话以b进行排序
array1 = np.array([[1, 2, 3],
[7, 5, 3],
[4, 8, 6]])
index = np.lexsort([-1*array1[:, 0], array1[:, 2]])#-1表示倒序
print(array1[index])
数学操作
np.sum(array,axis=)
多维数组 axis=0(第一个轴):表示对每列进行求和 axis=1(第二个轴):表示对每行进行求和
np.prod():相乘
np.mean():平均值
np.min()
np.max()
np.std():标准差
np.var():方差
np.cov():相关系数矩阵
np.clip(min,max):对数组进行限制,小于min的全变成min
np.round(array,decimals=):将数组元素四舍五入,decimals保留几位小数
运算np.multiply(x,y):矩阵对应的位置相乘
np.dot(x,y):矩阵乘法
np.logical_and():逻辑与
np.logical_not()
随机模块np.random.rand(low,high,size,dtype) ##生成的随机数 np.random.randn(low,high,size,dtype) ##生成的随机数,随机数服从标准正太分布 np.random.randint(low,high,size,dtype) ##生成随机整数 np.random.random_sample(size):##0-1之间随机取样 np.random.shuffle(array1):##洗牌切片是引用类型
切片在内存中使用的是引用机制
引用机制意味着,Python并没有为b分配新的空间来存储它的值,而实让b指向了a所分配的内存空间,因此,改变b会改变a的值。
a=np.array([0,1,2,3,4]) b=a[2:4] b #array([2, 3]) b[0]=10 a #array([ 0, 1, 10, 3, 4])
但是列表不是引用
花式索引切片只能支撑连续或者等间隔的切片操作,要想实现任意位置的操作,需要使用花式索引
一维花式索引花式索引需要指定索引位置
a=np.arange(0,100,10) a #array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90]) index=[1,2,-1,-2]#花式索引需要指定索引位置 a[index] #array([10, 20, 90, 80])
还可以使用布尔数组来花式索引
a=np.arange(0,100,10) a #array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90]) mask=np.array([0,2,2,0,0,1,0,0,1,0],dtype=bool) mask a[mask] #array([10, 20, 50, 80])
注意mask必须是布尔数组,长度必须和数组长度相等
二维花式索引a=np.array([[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],[30,31,32,33,34,35],[40,41,42,43,44,45],[50,51,52,53,54,55]])
a
#array([[ 0, 1, 2, 3, 4, 5],
# [10, 11, 12, 13, 14, 15],
# [20, 21, 22, 23, 24, 25],
# [30, 31, 32, 33, 34, 35],
# [40, 41, 42, 43, 44, 45],
# [50, 51, 52, 53, 54, 55]])
a[(0,1,2,3,4),(1,2,3,4,5)] ##两个括号相对位置的数分别为行标和列标
#array([ 1, 12, 23, 34, 45])
#返回最后三行的1,3,5列
a[-3:,0:6:2] a[-3:,[0,2,4]]
array([[30, 32, 34],
[40, 42, 44],
[50, 52, 54]])
mask=np.array([1,0,1,0,1,0],dtype=bool)
a[-3:,mask]
array([[30, 32, 34],
[40, 42, 44],
[50, 52, 54]])
where语句
where函数会返回所有非零元素的索引
a=np.array([1,2,3,4,5,6,7,8,9]) np.where(a>5) #(array([5, 6, 7, 8], dtype=int64),) np.where(a>5,1,0) #大于5用1,否则0 #array([0, 0, 0, 0, 0, 1, 1, 1, 1])
where返回的是索引,可以和数组一起用
a[np.where(a>5)] #array([6, 7, 8, 9])数组形状
通过np.shape(array)或者array.shape()去查看数组的形状
1.修改数组形状
array2.shape = (2, 3) array2 = array2.reshape(2,3)
2.新增一行或者一列
新增一行,array = array[np.newaxis, :] 新增一列,array = array[:, np.newaxis]
3.转置矩阵
array1.transpose() array1.T
4.数组的连接
竖着连接 np.concatenate((array1, array3), axis=0) np.vstack((a,b)) 横着连接 np.concatenate((array1, array3), axis=1) np.hstack((a,b)) 把多维数组变成一维数组 np.flatten()或者np.ravel()读写文件
1.读文件
np.loadtxt(‘file’,delimiter = ‘分隔符’,skiprows = n,usecols = ):通过这个方法直接读取文件内容
注意默认分隔符是空格,skiprows的参数n代表是跳过第几行,usecols表示使用哪几列
2.写文件
np.savetxt(‘file’,写的内容,fmt='%d %.2f ',delimiter=‘分隔符’)
3.以.npy的格式写文件
np.save(‘.npy’)
读取.npy的文件用np.load
多个矩阵以.npy格式保存 使用np.npz(‘.npz’,a=矩阵1,b=矩阵2)



