AI人工智能
1.NumPy科学计算库
1.什么是NumPy
python
# NumPy( Numerical Python) 是一个开源的Python科学计算库。提供多维数组对象,各种派生对象(如掩码数组和矩阵),
# 这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表结构更有效率。支持大量的维度数组与矩阵运算,此外也针对数组运算
# 提供大量的数学函数库,包括:数学、逻辑、形状操作、排序、选择、输入/输出、离散傅立叶变换、基本线性代数、基本统计运算、随机模拟等。
# 几乎所有从事Python工作的数据分析师都利用NumPy的强大功能。
# 强大的N维数组
# 成熟的广播功能
# 用于整合C/C++和Fortran代码的工具包
# NumPy提供了全面的数学功能、随机数生成器和线性代数工具
# 安装Python库
# 直接安装 anaconda2.安装Python库
- 1.第一种安装方式:
- python
# pip install jupyter -i https://pypi.tuna.tsinghua.edu.cn/simple # pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple - 2.第二种安装方式:
- 直接安装 anaconda
- 百度云盘链接: https://pan.baidu.com/s/16W9lDPCzesvhTJMC3_Evmg 提取码: xczb
- 注意:Add Path !!!添加一下环境变量项勾选上
- 启动终端
- python
# window + r 打开命令窗 # 输入命令:jupyter notebook # 在浏览器上显示对应的目录,windows默认路径是:C:\Users\用户名 # 注意:在哪个盘下cmd 打开命令窗 目录显示哪个盘下对应的文件
3.基本操作
1.NumPy数组创建
- python
# 1.创建数组的最简单方法就是使用array函数,将python下的list转换为ndarray。 # 例如: import numpy as np data = [1,2,3] np_array = np.array(data) print(np_array) np_array # 输出: [1 2 3] array([1, 2, 3]) # 2.我们可以利用np中的一些内置函数来创建数组,比如我们创建全0的数组,也可以创建全1的数组,全是其他数字的数组, # 或者等差数列数组,正态分布数组、随机数。 # 例如: import numpy as np # 1.zeros方法创建全0的数组 arr1 = np.zeros(shape=10) # shape=可省略 # 输出: array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) # 2.ones方法创建全1的数组 arr2 = np.ones(shape=10) # 输出: array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]) # 3.full方法创建全2的数组 arr3 = np.full(shape=10,fill_value=2) # 输出: array([2, 2, 2, 2, 2, 2, 2, 2, 2, 2]) # 4.random.randint方法创建10个随机整数 arr4 = np.random.randint(low=0,high=10,size=10) # 输出: array([5, 2, 1, 1, 4, 2, 6, 6, 6, 5]) # 5.random.randint方法创建二维数组 arr5 = np.random.randint(low=0,high=10,size=(3,4)) # 3 表示行 4表示列 # 输出: array([[3, 7, 5, 1], [4, 6, 9, 0], [7, 5, 5, 3]]) # 6.random.randint方法创建多维数组 arr6 = np.random.randint(low=0,high=10,size=(3,4,2)) # 3 表示维度 4表示行 2表示列 # 输出: array([[[8, 4], [0, 5], [9, 0], [7, 9]], [[5, 8], [2, 3], [3, 0], [7, 7]], [[8, 8], [8, 8], [6, 8], [6, 0]]]) # 7.random.randn方法创建10个正态分布(平均值是0,标准差是1)的随机数 arr5 = np.random.randn(10) # 输出: array([ 0.73815123, 0.42171884, -1.26525394, 0.13140223, -0.31972695, 0.49983426, -0.60134948, -0.10189951, -0.19864889, 0.14100691]) # 8.random.randm方法创建随机数组 arr6 = np.random.randm(3) # 输出: array([ 0.6851018 , 0.82257894, 0.2419718 ]) # 9.arange方法创建等差数列数组 arr3 = np.arange(start=0,stop=20,step=2) # 输出: array([0, 2, 4, 6, 8, 10, 12, 14, 16, 18]) # 10.linspace方法创建等差数列数组 arr4 = np.linspace(start=1,stop=10,num=10) # 输出: array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]) # 11.logspace方法创建等比数列数组 np.set_printoptions(suppress=True) # 设置不显示科学计数法 arr5 = np.logspace(start=1,stop=10,base=2,num=10) # 输出: array([ 2., 4., 8., 16., 32., 64., 128., 256., 512., 1024.]) 2.jupyter扩展插件(非必须安装插件,出现左侧展示效果)
- python
pip install jupyter_contrib_nbextensions -i https://pypi.tuna.tsinghua.edu.cn/simple pip install jupyter_nbextensions_configurator -i https://pypi.tuna.tsinghua.edu.cn/simple jupyter contrib nbextension install --user jupyter nbextensions_configurator enable --user 退出,重新进入jupyter notebook 就可以了 # NumPy的数组类称为ndarray,也被称为别名array.请注意,numpy.array这与标准的Python库类不同array.array, # 后者仅处理一维数组且功能较少,ndarray对象的重要属性是
3.数据查看
- python
# 1.数组的轴数、维度 import numpy as np arr1 = np.random.random(size=(3,4,5)) arr1.ndim # 输出:3 # 2.数组尺寸形状 arr1.shape # 输出:(3, 4, 5) # 3.数组的元素个数 arr1.size # 输出:3*4*5 = 60 # 4.数据类型 arr1.dtype # 输出:dtype('float64') # 5.数组中每个元素的大小(字节) arr1.itemsize # 输出:8 因为数据类型是float64,每个元素占8个字节 所以 64 / 8 = 8
4.文件IO操作
- python
# 1.保存数组 # save方法保存ndarray到一个npy文件,也可以使用savez将多个array保存到一个.npz文件中 # 创建数据 x = np.random.randn(5) y = np.arange(0,10,1) # save方法可以保存一个ndarray np.save('x_arr', x) # 如果要保存多个数组,可以使用savez方法,保存时以key-value形式保存,key任意(xarr,yarr) np.savez('x_y_arr.npz', xarr=x, yarr=y) # 2.读取数组 # load方法用于读取保存的数组,如果是.npz文件,读取之后相当于形成了一个key-value类型的变量,通过 # 保存时定义的key来访问数组 # 读取.npy文件 x_loaded = np.load('x_arr.npy') print(x_loaded) # 读取.npz文件 npz_loaded = np.load('x_y_arr.npz') print(npz_loaded['xarr']) print(npz_loaded['yarr']) # 3.读写csv、txt文件 # 创建数组 arr1 = np.random.randint(0,10,size=(3,4)) # 储存数组到txt文件 np.savetxt('arr1.txt', arr1, delimiter=',') # 储存数组到csv文件 np.savetxt('arr1.csv', arr1, delimiter=',') # 读取txt文件,delimiter为分隔符,dtype为数据类型 arr2 = np.loadtxt('arr1.txt', delimiter=',',dtype=np.int32) # 读取csv文件,delimiter为分隔符,dtype为数据类型 arr3 = np.loadtxt('arr1.csv', delimiter=',',dtype=np.int32)
4.数据类型
1.ndarray的数据类型:
- python
# int: int8、uint8、int16、uint16、int32、uint32、int64、uint64 (uint:无符号,没有负数,没有负号) # int8 表示范围:-2**8 - (2**8 -1) == -128 - 127(包含0所以取到127) # uint8 表示范围:0 - 2**8 -1 == 0 - 255(包含0所以取到255) # float: float16、float32、float64 # str 2.array创建时指定数据类型:
- python
# 创建一个float64类型的数组 import numpy as np arr = np.array([1,2,3],dtype=np.float64) # 输出:array([1., 2., 3.]) 3.asarray转换时指定数据类型:
- python
import numpy as np # 创建一个列表 arr = [1,2,3,4,5] # asarray将列表进行转换 arr1 = np.asarray(arr,dtype=np.float64) # 输出:array([1., 2., 3., 4., 5.]) 4.数据类型转换astype:
- python
import numpy as np # 创建一个float64类型的数组 arr = np.array([1,2,3],dtype=np.float64) # 转换为int32类型的数组 arr1 = arr.astype(np.int32) # 输出:array([1, 2, 3])
5.数组运算
1.加减乘除幂运算:
- python
import numpy as np # 创建两个数组 arr = np.array([1,2,3]) arr1 = np.array([4,5,6]) # 加法运算 print(arr+arr1) | print(arr + 5) # 减法运算 print(arr-arr1) | print(arr - 5) # 乘法运算 print(arr*arr1) | print(arr * 5) # 除法运算 print(arr/arr1) | print(arr / 5) # 幂运算 print(arr**arr1) | print(arr**5) 2.逻辑运算:
- python
import numpy as np # 创建两个数组 arr = np.array([1,2,3]) arr1 = np.array([4,5,6]) # 小于运算 print(arr<arr1) | print(arr < 5) # 大于运算 print(arr>arr1) | print(arr > 5) # 小于等于运算 print(arr<=arr1) | print(arr <= 5) # 大于等于运算 print(arr>=arr1) | print(arr >= 5) # 等于运算 print(arr==arr1) | print(arr == 5) # 不等于运算 print(arr!=arr1) | print(arr != 5) 3.数组与标量计算:
- python
# 数组与标量的算术运算也会将标量值传播到各个元素 import numpy as np # 创建一个数组 arr = np.array([1,2,3]) # 标量值 scalar = 5 # 加法运算 print(arr+scalar) | print(arr + 5) # 减法运算 print(arr-scalar) | print(arr - 5) # 乘法运算 print(arr*scalar) | print(arr * 5) # 除法运算 print(arr/scalar) | print(arr / 5) # 幂运算 print(arr**scalar) | print(arr**5) 4.*=、//=、%=、**=、+=、-=、<<=、>>=、&=、|=、^= 运算符:
- python
import numpy as np # 创建两个数组 arr = np.array([1,2,3]) arr1 = np.array([4,5,6]) # 加法赋值运算 print(arr+=arr1) | print(arr += 5) # 减法赋值运算 print(arr-=arr1) | print(arr -= 5) # 乘法赋值运算 print(arr*=arr1) | print(arr *= 5) # 除法赋值运算(不支持会报错) print(arr/=arr1) | print(arr /= 5) # 幂赋值运算 print(arr**=arr1) | print(arr **= 5) #
6.复制和视图
- python
# 在操作时,有时会将其数据复制到新数组中,有时不复制, # 对于初学者来说,通常会混乱,有以下三种情况 1.完全没有复制
- python
import numpy as np # 创建一个数组 arr = np.random.randint(0,100,size=(4,5)) arr1 = arr arr1 is arr # 返回为True, arr1 和 arr是两个不同名字对应同一个内存对象 arr1[0,0] = 1024 # 命运共同体 display(arr,arr1) 2.查看或浅拷贝
- python
import numpy as np # 创建一个数组 arr = np.random.randint(0,100,size=(4,5)) arr1 = arr.view() # 浅拷贝 使用arr中的数据创建一个新数组对象 arr1 is arr # 返回为False, arr1 和 arr是两个不同名字对应同一个内存对象 arr1.base is arr # 返回为True, arr1的根数据和arr一样 arr1.flags.owndata # 返回为False, arr1中的数据不是其自己的 arr.flags.owndata # 返回为True, arr中的数据是其自己的 arr1[0,0] = 1024 # arr1 和 arr 数据都发生变化 display(arr,arr1) 3.深拷贝
- python
import numpy as np # 创建一个数组 arr = np.random.randint(0,100,size=(4,5)) arr1 = arr.copy() # 深拷贝 使用arr中的数据创建一个新数组对象 arr1 is arr # 返回为False, arr1 和 arr是两个不同名字对应不同内存对象 arr1.base is arr # 返回为False, arr1和arr没有关联 arr1.flags.owndata # 返回为True, arr1中的数据是其自己的 arr.flags.owndata # 返回为True, arr中的数据是其自己的 arr1[0,0] = 1024 # arr1 数据都发生变化 arr 数据不发生变化 display(arr,arr1) # copy应该在不再需要原来的数组情况下,切片后调用,例如:假设a是一个巨大的中间结果,而最终结果b仅包含 # 的一小部分a,则在b使用切片进行构造时应制作一个深拷贝 a = np.random.rand(1000) b = a[10:20].copy() # 制作一个深拷贝 del a # 不再需要a,删除占大内存的a b.shape # 返回(10,)
7.索引、切片和迭代
1.基本索引和切片
- python
# numpy中数组切片是原始数组的视图,这意味着数据不会被复制,视图上任何数据的修改都会反映到原数组上 import numpy as np arr = np.array([0,1,2,3,4,5,6,7,8,9]) arr[5] # 索引 输出 5 arr[5:8] # 切片 输出 array([5 6 7]) arr[2::2] # 从索引2开始,步长为2 输出 array([2, 4, 6, 8]) arr[::3] # 不写索引默认从索引0开始,每3个中取一个 输出 array([0, 3, 6, 9]) arr[1:7:3] # 从索引1开始,到索引7结束,步长为3 输出 array([1, 4]) arr[::-1] # 步长为-1,表示逆序输出 array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0]) arr[::-2] # 步长为-2,表示逆序每2个取一个 输出 array([9, 7, 5, 3, 1]) arr[5:8] = 100 # 切片赋值 输出 array([0, 1, 2, 3, 4, 100, 100, 100, 7, 8, 9]) arr[5:8] = [100,200,300] # 切片赋值 输出 array([0, 1, 2, 3, 4, 100, 200, 300, 7, 8, 9]) temp = arr[5:8] # 切片赋值 输出 array([100, 200, 300]) temp[1] = 1024 display(arr) # 输出 array([0, 1, 2, 3, 4, 100, 1024, 300, 7, 8, 9]) # 对于二维数组或者高维数组,我们可以按照之前的知识来索引,当然也可以传入一个以逗号隔开的索引列表来选区单个或多个元素 arr = np.array([[1,2,3],[4,5,6],[7,8,9]]) arr[0,-1] #索引 等同于 arr[0][-1] 输出 3 arr[0,2] # 索引 等同于 arr[0][2] 输出 3 arr[:2,-2:] # 切片 第一维和第二维都进行切片 等同于 arr[:2][:,1:] 输出 array([[2, 3], [5 6]]) arr[:2,1:] # 切片 1 == -2 一个是正序,另一个是倒叙,对应相同位置 输出 array([[2, 3], [5 6]]) 2.花式索引和索引技巧