赞
踩
目录
笔记学习内容主要来源:NumPy 教程 | 菜鸟教程 (runoob.com),其中个别函数具体使用方法可参考网页中的内容。
numpy库的应用:通常与scipy(scientific python)和matplotlib(绘图库)结合使用,这种组合主要是为了替代matlab,有助于我们用python学习数据科学和机器学习。
nadarry:数组
1.数据类型(dtype)#类似python中的数据类型,可进行选择,例如:bool;int;float;complex;
2.数组形状(shape)#用来描述数组中的数据为几行几列。
数组的常用属性:
ndarray.ndim | 秩,即轴的数量或维度的数量 |
ndarray.shape | 数组的维度,对于矩阵,n 行 m 列 |
ndarray.size | 数组元素的总个数,相当于 .shape 中 n*m 的值 |
ndarray.dtype | ndarray 对象的元素类型 |
示例
- import numpy as np
- a=np.array(range(10),dtype=int) #dtype可以指定数据类型,如float#
- print(a)
- print(a.shape) #输出数据形状
- b=a.reshape((2,5)) #改变a的数据形状为2行5列
- print(b)
- print(b.shape)
- print(a.dtype) #输出a中的数据类型
- print(type(a))
输出:
- [0 1 2 3 4 5 6 7 8 9]
- (10,) #代表一维数据,1行10列
- [[0 1 2 3 4]
- [5 6 7 8 9]]
- (2, 5)
- int32
- <class 'numpy.ndarray'>
代码:
- #三种方法如下:
- import numpy as np
- a=np.array([1,2,2,3,4]) #方法一
- b=np.array(range(1,10)) #方法二
- a=np.array([[1,2,2,3,4],[2,3,4]]) #方法二,必须放在一个【】中,否则会报错
- c=np.arange(1,6) #方法三
- print(a)
- print(b)
- print(c)
输出:
- [1 2 2 3 4]
- [1 2 3 4 5 6 7 8 9]
- [list([1, 2, 2, 3, 4]) list([2, 3, 4])]
- [1 2 3 4 5]
shape 和 reshape
- import numpy as np
- a=np.array([[1,2,3],[4,5,6]])
- print(a)
- print(a.shape) #获取a的数组形状
- #改变数组形状需注意改变后的大小不变
- a1=a.reshape((3,2)) #将a改为3行2列
- a2=a.reshape((6,)) #将a改为一维
- a3=a.reshape((6,1)) #将a改为6行1列
- a4=a.reshape((1,6)) #将a改为1行6列
- a5=a.reshape((a.shape[0]*a.shape[1],)) #a.shape[0]和a.shape[1]分别代表行和列
- a6=a.flatten() #将a转为一维形状
- print(a1)
- print(a2)
- print(a3)
- print(a4)
- print(a5)
- print(a6)
输出:
- [[1 2 3]
- [4 5 6]]
- (2, 3)
- [[1 2]
- [3 4]
- [5 6]]
- [1 2 3 4 5 6]
- [[1]
- [2]
- [3]
- [4]
- [5]
- [6]]
- [[1 2 3 4 5 6]]
- [1 2 3 4 5 6]
- [1 2 3 4 5 6]
运算:加减乘除;分为数组与实数的运算,数组与数组的运算;代码示例如下
- import numpy as np
- #创建一个数组
- a=np.array([[0,1,2,3,4,5],
- [6,7,8,9,10,11],
- [12,13,14,15,16,17],
- [18,19,20,21,22,23]])
- #数组与实数的加法:将数组的每一个数都相加
- print(a+2)
- #数组与实数的乘法:将数组的每一个数都相乘
- print(a*2)
- #数组与实数的除法:将数组的每一个数都相除;可以对0进行运算(其中inf:无穷大;nan:非实数)
- print(a/2)
- print(a/0)
输出
- [[ 2 3 4 5 6 7]
- [ 8 9 10 11 12 13]
- [14 15 16 17 18 19]
- [20 21 22 23 24 25]]
- [[ 0 2 4 6 8 10]
- [12 14 16 18 20 22]
- [24 26 28 30 32 34]
- [36 38 40 42 44 46]]
- [[ 0. 0.5 1. 1.5 2. 2.5]
- [ 3. 3.5 4. 4.5 5. 5.5]
- [ 6. 6.5 7. 7.5 8. 8.5]
- [ 9. 9.5 10. 10.5 11. 11.5]]
- [[nan inf inf inf inf inf]
- [inf inf inf inf inf inf]
- [inf inf inf inf inf inf]
- [inf inf inf inf inf inf]]
- import numpy as np
- #创建一个数组
- a=np.array([[0,1,2,3,4,5],
- [6,7,8,9,10,11],
- [12,13,14,15,16,17],
- [18,19,20,21,22,23]])
- #创建一个形状相同的数组进行运算
- b=np.arange(100,124).reshape((4,6))
- print(a+b) #对应元素相加或乘除,这里就不演示了
- #创建不同维度的数组进行运算
- c=np.arange(0,6)
- print(a+c) #因为列相同所以每列可以进行运算
- d=np.arange(0,4).reshape((4,1))
- print(a+d) #因为行数相同所以也可以进行运算,即每行进行相加减
- #总结:只要运算的数组行与列其中存在相同就可以运算满足广播原则,对于三维只要存在某个空间形状相同也可以进行运算。
- ###广播原则如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。
- #广播会在缺失和(或)长度为1的维度上进行。 这句话乃是理解广播的核心。 广播主要发生在两种情况,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符,
- #另外一种是有一方的长度为1。
输出
- [[100 102 104 106 108 110]
- [112 114 116 118 120 122]
- [124 126 128 130 132 134]
- [136 138 140 142 144 146]]
- [[ 0 2 4 6 8 10]
- [ 6 8 10 12 14 16]
- [12 14 16 18 20 22]
- [18 20 22 24 26 28]]
- [[ 0 1 2 3 4 5]
- [ 7 8 9 10 11 12]
- [14 15 16 17 18 19]
- [21 22 23 24 25 26]]
axis:可以理解为方向,使用数字0,1,2等数字表示,对于一维数组,只有一个0轴;对于2维数组(shape(2,2)),有0轴和1轴,引入这个概念是为了计算数组的平均值的时候,可以进行指定是哪个方向上的数字的平均值。例如:
- np.arange(0,10).reshape((2,5))
- #reshape中2表示0轴上长度为2,5表示1轴上长度为5.
np.loadtxt(frame,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
#参数:
示例编写:
- import numpy as np
- file_path="C:\Program Files\Python38" #文件路径相当于那个frame
- a=np.loadtxt(file_path,delimiter=",",dtype="int") #定义参数
- print(a)
#这里没有提供相应的文件,只是简单示例编写方法。
#补充一下numpy中转置的三种方法(除了改变unpack):
- import numpy as np
- a=np.array(range(18)).reshape((3,6))
- print(a)
- b=a.transpose()
- c=a.T
- d=a.swapaxes(1,0)
- print("*"*100)
- print(b)
- print("*"*100)
- print(c)
- print("*"*100)
- print(d)
输出:
- [[ 0 1 2 3 4 5]
- [ 6 7 8 9 10 11]
- [12 13 14 15 16 17]]
- ****************************************************************************************************
- [[ 0 6 12]
- [ 1 7 13]
- [ 2 8 14]
- [ 3 9 15]
- [ 4 10 16]
- [ 5 11 17]]
- ****************************************************************************************************
- [[ 0 6 12]
- [ 1 7 13]
- [ 2 8 14]
- [ 3 9 15]
- [ 4 10 16]
- [ 5 11 17]]
- ****************************************************************************************************
- [[ 0 6 12]
- [ 1 7 13]
- [ 2 8 14]
- [ 3 9 15]
- [ 4 10 16]
- [ 5 11 17]]
注意:numpy中的索引和python中类似,也是从0开始;
直接上代码示例:
- import numpy as np
- # a=np.array(range(18)).reshape((3,6))
- a=np.array([[0,1,2,3],
- [4,5,6,7],
- [8,9,10,11]])
- print(a)
- #取一行或多行
- print("*"*100)
- print(a[1]) #第二行
- print("*"*100)
- print(a[1:3]) #取连续多行
- print("*"*100)
- print(a[[0,2]]) #取不连续多行,注意其中有两个【】
-
- #取一列或多列
- print("*"*100)
- print(a[:,2]) #取第三列;取列的方法在下面会详细介绍;
- print("*"*100)
- print(a[:,2:4])
-
- #取多行和多列:取的是交叉的点
- print("*"*100)
- print(a[0:2,1:3])
- #取多个不相邻的点
- print(a[[1,1],[1,2]]) #取出的是(1,1);(1,2)对应的点??
- import numpy as np
- # a=np.array(range(18)).reshape((3,6))
- a=np.array([[0,1,2,3],
- [4,5,6,7],
- [8,9,10,11]])
- a[:,1:3]=0 #将切片数据赋值为0
- print(a)
- print("*"*100)
- print(a<5) #a中小于5的为true
输出:
- [[ 0 0 0 3]
- [ 4 0 0 7]
- [ 8 0 0 11]]
- *******************************************************************************************
- [[ True True True True]
- [ True True True False]
- [False True True False]]
- import numpy as np
- # a=np.array(range(18)).reshape((3,6))
- a=np.array([[0,1,2,3],
- [4,5,6,7],
- [8,9,10,11]])
- a[a<5]=0
- print(a)
输出
- [[ 0 0 0 0]
- [ 0 5 6 7]
- [ 8 9 10 11]]
注意:一个是np.where;另一个为a.clip;使用方法不同。
- import numpy as np
- a=np.arange(24).reshape((4,6))
- b=np.where(a<10,0,10) #numpy的三元运算符,将a中小于10的数赋值为0,大于的赋值为10
- print(b)
- print("*"*80)
- c=a.clip(10,18) #裁剪,小于10替换为10,大于18替换为18;
- print(c)
输出:
- [[ 0 0 0 0 0 0]
- [ 0 0 0 0 10 10]
- [10 10 10 10 10 10]
- [10 10 10 10 10 10]]
- ********************************************************************************
- [[10 10 10 10 10 10]
- [10 10 10 10 10 11]
- [12 13 14 15 16 17]
- [18 18 18 18 18 18]]
注意:nan和inf的数据类型为float;如果想进行数据转换,需要进行先将数据dtype设置为float
- import numpy as np
- # 两个nan是不相等的
- print(np.nan==np.nan)
- print(np.nan!=np.nan)
- #利用以上特性可以计算出数据中nan的个数
- a=np.array([1.,3.,np.nan])
- print(np.count_nonzero(a!=a)) #count_nonzero:统计非0的数据的个数
- #将判断为nan的数值赋值为0:对数据进行判断:用isnan():统计数据中为nan的个数时用
- a[np.isnan(a)]=0
- print(a)
输出:
- False
- True
- 1
- [1. 3. 0.]
nan的处理:在数据分析中如果出现nan时:一般将其所在行删除,或者将nan位置的数值替换为该列的平均值,选择后者一般不影响数据的完整性。因此下一节介绍一些常用的numpy中的统计方法
- import numpy as np
- a=np.array([[0,1,2,3],
- [4,5,6,7],
- [8,9,np.nan,10]])
- #sum
- print(a.sum(axis=0)) #求和列
- print(a.sum()) #总求和
- #median
- print(np.median(a,axis=0)) #求中值
输出:
- [12. 15. nan 20.]
- nan
- [ 4. 5. nan 7.]
- import numpy as np
-
- def fill_ndarray(a):
- for i in range(a.shape[1]): #遍历每一列
- tem_col=a[:,i] #当前列
- nan_num=np.count_nonzero(tem_col!=tem_col)
- if nan_num !=0: #不为0,说明当前列有nan
- tem_not_nan_col=tem_col[tem_col==tem_col] #当前列不为nan的array
- #选当前为nan的位置,将不为nan的均值赋值给nan
- tem_col[np.isnan(tem_col)]=tem_not_nan_col.mean()
- return a
-
- if __name__=="__main__":
- a = np.arange(12).reshape((3, 4)).astype("float") #astype将数据类型设置为float
- a[1, 2:] = np.nan
- print(a)
- print("*"*80)
- a=fill_ndarray(a)
- print(a)
输出:
- [[ 0. 1. 2. 3.]
- [ 4. 5. nan nan]
- [ 8. 9. 10. 11.]]
- ********************************************************************************
- [[ 0. 1. 2. 3.]
- [ 4. 5. 6. 7.]
- [ 8. 9. 10. 11.]]
- import numpy as np
- a=np.array([[1,2,3,4],
- [5,6,7,8]])
- b=np.array([[9,10,11,12],
- [13,14,15,16]])
- #竖直拼接vstack
- print(np.vstack((a,b)))
- #水平拼接 hstack
- print("*"*80)
- print(np.hstack((a,b)))
输出:
- [[ 1 2 3 4]
- [ 5 6 7 8]
- [ 9 10 11 12]
- [13 14 15 16]]
- ********************************************************************************
- [[ 1 2 3 4 9 10 11 12]
- [ 5 6 7 8 13 14 15 16]]
5.2 交换行/列
目的:为了两个数据的数据处理
- import numpy as np
- a=np.arange(12,24).reshape((3,4))
- print(a)
- print("*"*80)
- #行交换
- a[[1,2],:]=a[[2,1],:]
- print(a)
- print("*"*80)
- #列交换
- a[:,[0,2]]=a[:,[2,0]]
- print(a)
- print("*"*80)
- #补充:构造全为0/1的数组
- b=np.zeros((2,3))
- c=np.ones((3,3))
- print(b)
- print(c)
- print("*"*80)
- #创建一个全为1的正方形数组eye()
- d=np.eye(3)
- print(d)
- print("*"*80)
- #获取最大最小值的位置
- print(a)
- print(np.argmax(a,axis=0))
- print(np.argmin(a,axis=1))
输出:
- [[12 13 14 15]
- [16 17 18 19]
- [20 21 22 23]]
- ********************************************************************************
- [[12 13 14 15]
- [20 21 22 23]
- [16 17 18 19]]
- ********************************************************************************
- [[14 13 12 15]
- [22 21 20 23]
- [18 17 16 19]]
- ********************************************************************************
- [[0. 0. 0.]
- [0. 0. 0.]]
- [[1. 1. 1.]
- [1. 1. 1.]
- [1. 1. 1.]]
- ********************************************************************************
- [[1. 0. 0.]
- [0. 1. 0.]
- [0. 0. 1.]]
- ********************************************************************************
- [[14 13 12 15]
- [22 21 20 23]
- [18 17 16 19]]
- [1 1 1 1]
- [2 2 2]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。