当前位置:   article > 正文

numpy库学习---个人总结笔记_数据挖掘numpy库的笔记

数据挖掘numpy库的笔记

目录

一.前言

二.numpy库基础知识

 2.1数组的芝士:

2.2 创建数组

2.3改变数组形状

2.4数组的运算

2.4.1数组与实数的运算

2.4.2数组与数组的运算

 三.numpy读取数据

3.1基本概念(轴)

3.2 numpy读取数据

3.3 numpy转置方法(补充)

四. numpy的索引与切片

4.1常见的切片索引需求

4.2 numpy中数值的修改

4.3 布尔索引

4.4 三元运算符(where)和裁剪(clip)

4.5 numpy中的nan和inf

4.6 numpy中常见的统计方法

4.7 numpy应用实例(数据处理)

五. 数组的拼接

5.1 拼接的方式(水平/竖直)

六.numpy生成随机数

6.1常用参数

6.2 numpy的注意点


一.前言

笔记学习内容主要来源:NumPy 教程 | 菜鸟教程 (runoob.com),其中个别函数具体使用方法可参考网页中的内容。

numpy库的应用:通常与scipy(scientific python)和matplotlib(绘图库)结合使用,这种组合主要是为了替代matlab,有助于我们用python学习数据科学和机器学习。

二.numpy库基础知识

nadarry:数组

 2.1数组的芝士:

1.数据类型(dtype)#类似python中的数据类型,可进行选择,例如:bool;int;float;complex;

2.数组形状(shape)#用来描述数组中的数据为几行几列。

        数组的常用属性:

ndarray.ndim秩,即轴的数量或维度的数量
ndarray.shape

数组的维度,对于矩阵,n 行 m 列

ndarray.size数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtypendarray 对象的元素类型

示例

  1. import numpy as np
  2. a=np.array(range(10),dtype=int) #dtype可以指定数据类型,如float#
  3. print(a)
  4. print(a.shape) #输出数据形状
  5. b=a.reshape((2,5)) #改变a的数据形状为2行5列
  6. print(b)
  7. print(b.shape)
  8. print(a.dtype) #输出a中的数据类型
  9. print(type(a))

输出:

  1. [0 1 2 3 4 5 6 7 8 9]
  2. (10,) #代表一维数据,110
  3. [[0 1 2 3 4]
  4. [5 6 7 8 9]]
  5. (2, 5)
  6. int32
  7. <class 'numpy.ndarray'>

2.2 创建数组

代码:

  1. #三种方法如下:
  2. import numpy as np
  3. a=np.array([1,2,2,3,4]) #方法一
  4. b=np.array(range(1,10)) #方法二
  5. a=np.array([[1,2,2,3,4],[2,3,4]]) #方法二,必须放在一个【】中,否则会报错
  6. c=np.arange(1,6) #方法三
  7. print(a)
  8. print(b)
  9. print(c)

输出:

  1. [1 2 2 3 4]
  2. [1 2 3 4 5 6 7 8 9]
  3. [list([1, 2, 2, 3, 4]) list([2, 3, 4])]
  4. [1 2 3 4 5]

2.3改变数组形状

shape 和 reshape

  1. import numpy as np
  2. a=np.array([[1,2,3],[4,5,6]])
  3. print(a)
  4. print(a.shape) #获取a的数组形状
  5. #改变数组形状需注意改变后的大小不变
  6. a1=a.reshape((3,2)) #将a改为32
  7. a2=a.reshape((6,)) #将a改为一维
  8. a3=a.reshape((6,1)) #将a改为61
  9. a4=a.reshape((1,6)) #将a改为16
  10. a5=a.reshape((a.shape[0]*a.shape[1],)) #a.shape[0]和a.shape[1]分别代表行和列
  11. a6=a.flatten() #将a转为一维形状
  12. print(a1)
  13. print(a2)
  14. print(a3)
  15. print(a4)
  16. print(a5)
  17. print(a6)

输出:

  1. [[1 2 3]
  2. [4 5 6]]
  3. (2, 3)
  4. [[1 2]
  5. [3 4]
  6. [5 6]]
  7. [1 2 3 4 5 6]
  8. [[1]
  9. [2]
  10. [3]
  11. [4]
  12. [5]
  13. [6]]
  14. [[1 2 3 4 5 6]]
  15. [1 2 3 4 5 6]
  16. [1 2 3 4 5 6]

2.4数组的运算

运算:加减乘除;分为数组与实数的运算,数组与数组的运算;代码示例如下

2.4.1数组与实数的运算

  1. import numpy as np
  2. #创建一个数组
  3. a=np.array([[0,1,2,3,4,5],
  4. [6,7,8,9,10,11],
  5. [12,13,14,15,16,17],
  6. [18,19,20,21,22,23]])
  7. #数组与实数的加法:将数组的每一个数都相加
  8. print(a+2)
  9. #数组与实数的乘法:将数组的每一个数都相乘
  10. print(a*2)
  11. #数组与实数的除法:将数组的每一个数都相除;可以对0进行运算(其中inf:无穷大;nan:非实数)
  12. print(a/2)
  13. print(a/0)

输出

  1. ​[[ 2 3 4 5 6 7]
  2. [ 8 9 10 11 12 13]
  3. [14 15 16 17 18 19]
  4. [20 21 22 23 24 25]]
  5. [[ 0 2 4 6 8 10]
  6. [12 14 16 18 20 22]
  7. [24 26 28 30 32 34]
  8. [36 38 40 42 44 46]]
  9. [[ 0. 0.5 1. 1.5 2. 2.5]
  10. [ 3. 3.5 4. 4.5 5. 5.5]
  11. [ 6. 6.5 7. 7.5 8. 8.5]
  12. [ 9. 9.5 10. 10.5 11. 11.5]]
  13. [[nan inf inf inf inf inf]
  14. [inf inf inf inf inf inf]
  15. [inf inf inf inf inf inf]
  16. [inf inf inf inf inf inf]]

2.4.2数组与数组的运算

  1. import numpy as np
  2. #创建一个数组
  3. a=np.array([[0,1,2,3,4,5],
  4. [6,7,8,9,10,11],
  5. [12,13,14,15,16,17],
  6. [18,19,20,21,22,23]])
  7. #创建一个形状相同的数组进行运算
  8. b=np.arange(100,124).reshape((4,6))
  9. print(a+b) #对应元素相加或乘除,这里就不演示了
  10. #创建不同维度的数组进行运算
  11. c=np.arange(0,6)
  12. print(a+c) #因为列相同所以每列可以进行运算
  13. d=np.arange(0,4).reshape((4,1))
  14. print(a+d) #因为行数相同所以也可以进行运算,即每行进行相加减
  15. #总结:只要运算的数组行与列其中存在相同就可以运算满足广播原则,对于三维只要存在某个空间形状相同也可以进行运算。
  16. ###广播原则如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。
  17. #广播会在缺失和(或)长度为1的维度上进行。 这句话乃是理解广播的核心。 广播主要发生在两种情况,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符,
  18. #另外一种是有一方的长度为1

输出

  1. [[100 102 104 106 108 110]
  2. [112 114 116 118 120 122]
  3. [124 126 128 130 132 134]
  4. [136 138 140 142 144 146]]
  5. [[ 0 2 4 6 8 10]
  6. [ 6 8 10 12 14 16]
  7. [12 14 16 18 20 22]
  8. [18 20 22 24 26 28]]
  9. [[ 0 1 2 3 4 5]
  10. [ 7 8 9 10 11 12]
  11. [14 15 16 17 18 19]
  12. [21 22 23 24 25 26]]

 三.numpy读取数据

3.1基本概念(轴)

axis:可以理解为方向,使用数字0,1,2等数字表示,对于一维数组,只有一个0轴;对于2维数组(shape(2,2)),有0轴和1轴,引入这个概念是为了计算数组的平均值的时候,可以进行指定是哪个方向上的数字的平均值。例如:

  1. np.arange(0,10).reshape((2,5))
  2. #reshape中2表示0轴上长度为25表示1轴上长度为5.

3.2 numpy读取数据

np.loadtxt(frame,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)

 #参数:

  1. frame:文件/字符串或路径,可以是.gz或bz2压缩文件
  2. dtype:数据类型,可选。
  3. delimiter:分隔字符串,默认是空格,可以改为逗号
  4. skiprows:跳过前x行
  5. usecols:读取指定的列,索引,元组类型
  6. unpacks:默认False,可以理解为有多少数据就有多少行;如果为True,读入属性将分别写入不同数组变量,可以理解为转置开关。

示例编写:

  1. import numpy as np
  2. file_path="C:\Program Files\Python38" #文件路径相当于那个frame
  3. a=np.loadtxt(file_path,delimiter=",",dtype="int") #定义参数
  4. print(a)

#这里没有提供相应的文件,只是简单示例编写方法。

3.3 numpy转置方法(补充)

#补充一下numpy中转置的三种方法(除了改变unpack):

  1. a.swapaxes(1,0) #这里的1,0代表轴
  2. a.transpose()
  3. a.T
    1. import numpy as np
    2. a=np.array(range(18)).reshape((3,6))
    3. print(a)
    4. b=a.transpose()
    5. c=a.T
    6. d=a.swapaxes(1,0)
    7. print("*"*100)
    8. print(b)
    9. print("*"*100)
    10. print(c)
    11. print("*"*100)
    12. print(d)

    输出:

  1. [[ 0 1 2 3 4 5]
  2. [ 6 7 8 9 10 11]
  3. [12 13 14 15 16 17]]
  4. ****************************************************************************************************
  5. [[ 0 6 12]
  6. [ 1 7 13]
  7. [ 2 8 14]
  8. [ 3 9 15]
  9. [ 4 10 16]
  10. [ 5 11 17]]
  11. ****************************************************************************************************
  12. [[ 0 6 12]
  13. [ 1 7 13]
  14. [ 2 8 14]
  15. [ 3 9 15]
  16. [ 4 10 16]
  17. [ 5 11 17]]
  18. ****************************************************************************************************
  19. [[ 0 6 12]
  20. [ 1 7 13]
  21. [ 2 8 14]
  22. [ 3 9 15]
  23. [ 4 10 16]
  24. [ 5 11 17]]

四. numpy的索引与切片

4.1常见的切片索引需求

注意:numpy中的索引和python中类似,也是从0开始;

直接上代码示例:

  1. import numpy as np
  2. # a=np.array(range(18)).reshape((3,6))
  3. a=np.array([[0,1,2,3],
  4. [4,5,6,7],
  5. [8,9,10,11]])
  6. print(a)
  7. #取一行或多行
  8. print("*"*100)
  9. print(a[1]) #第二行
  10. print("*"*100)
  11. print(a[1:3]) #取连续多行
  12. print("*"*100)
  13. print(a[[0,2]]) #取不连续多行,注意其中有两个【】
  14. #取一列或多列
  15. print("*"*100)
  16. print(a[:,2]) #取第三列;取列的方法在下面会详细介绍;
  17. print("*"*100)
  18. print(a[:,2:4])
  19. #取多行和多列:取的是交叉的点
  20. print("*"*100)
  21. print(a[0:2,1:3])
  22. #取多个不相邻的点
  23. print(a[[1,1],[1,2]]) #取出的是(11);(12)对应的点??

4.2 numpy中数值的修改

  1. import numpy as np
  2. # a=np.array(range(18)).reshape((3,6))
  3. a=np.array([[0,1,2,3],
  4. [4,5,6,7],
  5. [8,9,10,11]])
  6. a[:,1:3]=0 #将切片数据赋值为0
  7. print(a)
  8. print("*"*100)
  9. print(a<5) #a中小于5的为true

输出:

  1. [[ 0 0 0 3]
  2. [ 4 0 0 7]
  3. [ 8 0 0 11]]
  4. *******************************************************************************************
  5. [[ True True True True]
  6. [ True True True False]
  7. [False True True False]]

4.3 布尔索引

  1. import numpy as np
  2. # a=np.array(range(18)).reshape((3,6))
  3. a=np.array([[0,1,2,3],
  4. [4,5,6,7],
  5. [8,9,10,11]])
  6. a[a<5]=0
  7. print(a)

输出

  1. [[ 0 0 0 0]
  2. [ 0 5 6 7]
  3. [ 8 9 10 11]]

4.4 三元运算符(where)和裁剪(clip)

注意:一个是np.where;另一个为a.clip;使用方法不同。

  1. import numpy as np
  2. a=np.arange(24).reshape((4,6))
  3. b=np.where(a<10,0,10) #numpy的三元运算符,将a中小于10的数赋值为0,大于的赋值为10
  4. print(b)
  5. print("*"*80)
  6. c=a.clip(10,18) #裁剪,小于10替换为10,大于18替换为18
  7. print(c)

输出:

  1. [[ 0 0 0 0 0 0]
  2. [ 0 0 0 0 10 10]
  3. [10 10 10 10 10 10]
  4. [10 10 10 10 10 10]]
  5. ********************************************************************************
  6. [[10 10 10 10 10 10]
  7. [10 10 10 10 10 11]
  8. [12 13 14 15 16 17]
  9. [18 18 18 18 18 18]]

4.5 numpy中的nan和inf

  1. nan:not a number:不是一个数字;当打开一个文件时,文件数据缺失的部分就为nan,或者做一个不合适的计算的时候(比如inf减去inf)
  2. inf:表示正无穷大;-inf表示负无穷大

注意:nan和inf的数据类型为float;如果想进行数据转换,需要进行先将数据dtype设置为float

  1. import numpy as np
  2. # 两个nan是不相等的
  3. print(np.nan==np.nan)
  4. print(np.nan!=np.nan)
  5. #利用以上特性可以计算出数据中nan的个数
  6. a=np.array([1.,3.,np.nan])
  7. print(np.count_nonzero(a!=a)) #count_nonzero:统计非0的数据的个数
  8. #将判断为nan的数值赋值为0:对数据进行判断:用isnan():统计数据中为nan的个数时用
  9. a[np.isnan(a)]=0
  10. print(a)

输出:

  1. False
  2. True
  3. 1
  4. [1. 3. 0.]

nan的处理:在数据分析中如果出现nan时:一般将其所在行删除,或者将nan位置的数值替换为该列的平均值,选择后者一般不影响数据的完整性。因此下一节介绍一些常用的numpy中的统计方法

4.6 numpy中常见的统计方法

  1. 求和:a.sum(axis=None)  #nan和任何值的运算结果都为nan。
  2. 均值:a.mean(a,axis=None)
  3. 中值:np.median(a,axis=None)
  4. 最大/小值:a.max/min(axis=None)
  5. 极值:np.ptp(a,axis=None)  #最大值和最小值的差
  6. 标准差:a.std(axis=None)  #代表这些数值接近平均值反映数据的波动稳定情况,越大表示波动越大。
  1. import numpy as np
  2. a=np.array([[0,1,2,3],
  3. [4,5,6,7],
  4. [8,9,np.nan,10]])
  5. #sum
  6. print(a.sum(axis=0)) #求和列
  7. print(a.sum()) #总求和
  8. #median
  9. print(np.median(a,axis=0)) #求中值

输出:

  1. [12. 15. nan 20.]
  2. nan
  3. [ 4. 5. nan 7.]

4.7 numpy应用实例(数据处理)

  1. import numpy as np
  2. def fill_ndarray(a):
  3. for i in range(a.shape[1]): #遍历每一列
  4. tem_col=a[:,i] #当前列
  5. nan_num=np.count_nonzero(tem_col!=tem_col)
  6. if nan_num !=0: #不为0,说明当前列有nan
  7. tem_not_nan_col=tem_col[tem_col==tem_col] #当前列不为nan的array
  8. #选当前为nan的位置,将不为nan的均值赋值给nan
  9. tem_col[np.isnan(tem_col)]=tem_not_nan_col.mean()
  10. return a
  11. if __name__=="__main__":
  12. a = np.arange(12).reshape((3, 4)).astype("float") #astype将数据类型设置为float
  13. a[1, 2:] = np.nan
  14. print(a)
  15. print("*"*80)
  16. a=fill_ndarray(a)
  17. print(a)

输出:

  1. [[ 0. 1. 2. 3.]
  2. [ 4. 5. nan nan]
  3. [ 8. 9. 10. 11.]]
  4. ********************************************************************************
  5. [[ 0. 1. 2. 3.]
  6. [ 4. 5. 6. 7.]
  7. [ 8. 9. 10. 11.]]

五. 数组的拼接

5.1 拼接的方式(水平/竖直)

  1. import numpy as np
  2. a=np.array([[1,2,3,4],
  3. [5,6,7,8]])
  4. b=np.array([[9,10,11,12],
  5. [13,14,15,16]])
  6. #竖直拼接vstack
  7. print(np.vstack((a,b)))
  8. #水平拼接 hstack
  9. print("*"*80)
  10. print(np.hstack((a,b)))

输出:

  1. [[ 1 2 3 4]
  2. [ 5 6 7 8]
  3. [ 9 10 11 12]
  4. [13 14 15 16]]
  5. ********************************************************************************
  6. [[ 1 2 3 4 9 10 11 12]
  7. [ 5 6 7 8 13 14 15 16]]

5.2 交换行/列

目的:为了两个数据的数据处理

  1. import numpy as np
  2. a=np.arange(12,24).reshape((3,4))
  3. print(a)
  4. print("*"*80)
  5. #行交换
  6. a[[1,2],:]=a[[2,1],:]
  7. print(a)
  8. print("*"*80)
  9. #列交换
  10. a[:,[0,2]]=a[:,[2,0]]
  11. print(a)
  12. print("*"*80)
  13. #补充:构造全为0/1的数组
  14. b=np.zeros((2,3))
  15. c=np.ones((3,3))
  16. print(b)
  17. print(c)
  18. print("*"*80)
  19. #创建一个全为1的正方形数组eye()
  20. d=np.eye(3)
  21. print(d)
  22. print("*"*80)
  23. #获取最大最小值的位置
  24. print(a)
  25. print(np.argmax(a,axis=0))
  26. print(np.argmin(a,axis=1))

输出:

  1. [[12 13 14 15]
  2. [16 17 18 19]
  3. [20 21 22 23]]
  4. ********************************************************************************
  5. [[12 13 14 15]
  6. [20 21 22 23]
  7. [16 17 18 19]]
  8. ********************************************************************************
  9. [[14 13 12 15]
  10. [22 21 20 23]
  11. [18 17 16 19]]
  12. ********************************************************************************
  13. [[0. 0. 0.]
  14. [0. 0. 0.]]
  15. [[1. 1. 1.]
  16. [1. 1. 1.]
  17. [1. 1. 1.]]
  18. ********************************************************************************
  19. [[1. 0. 0.]
  20. [0. 1. 0.]
  21. [0. 0. 1.]]
  22. ********************************************************************************
  23. [[14 13 12 15]
  24. [22 21 20 23]
  25. [18 17 16 19]]
  26. [1 1 1 1]
  27. [2 2 2]

六.numpy生成随机数

6.1常用参数

  1. .rand(d0,d1,d2,,,,dn):创建d0到dn维度的均匀分布的随机数组,浮点数,范围:0-1
  2. .randn(d0,d1,d2,,,,dn):创建d0到dn维度的标准正态分布随机数,浮点数,平均数0,标准差1
  3. .randint(low,high,(shape)):从给定上下限范围选取随机整数,范围是low,high,形状时shape
  4. .uniform(low,high,(size)):产生均匀分布的数组,low起始值,high结束值,size形状
  5. .seed(s):随机数种子,作用同python

6.2 numpy的注意点

  1. a=b 完全不复制,a和b相互影响
  2. a=b[:],一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化时一致的
  3. a=b.copy(),复制,a和b互不影响。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/142612
推荐阅读
相关标签
  

闽ICP备14008679号