一. NumPy介绍
1. 介绍
NumPy(Numerical Python)是Python的一个开源的数值计算库。
可用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多,
支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,
包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等等
几乎所有从事Python工作的数据分析师都利用NumPy的强大功能。
2. 安装第三方库
!pip install numpy
# 查看 numpy版本
import numpy as np
np.__version__
3. 数据分析'三剑客'
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 读取同目录下的图片
# plt.imread: 读取图片的数据
img_data = plt.imread('123.jpg')
print(img_data) # 三维数组
"""
图片: 其实是数字组成的,三维数组
RGB: 红Red,绿Green,蓝Blue
RGB 范围: 0-255
"""
print(type(img_data)) #numpy.ndarray 类型
"""
numpy.ndarray:多维数组 类型
nd: n维度,多维
array: 数组
"""
# 查看形状 :三维
print(img_data.shape) # (300, 750, 3)
"""
高度: 300行
宽度: 750列
3 表示的是RGB(red,green,blue)的值
"""
# 显示图片
print(plt.imshow(img_data)) # 显示整张图片:(300, 750, 3)
# 图片: 3维数据(彩色)
# 2维数据(黑白)
# 视频: 4维数据
# (x,300,750,3)
# 一切皆数据,一切皆矩阵
二. 创建NumPy数组(ndarray)
1. 使用np.array()由python list创建
# 语法: n = np.array(list)
# 示例:
l = [1,4,2,3,5]
n = np.array(l)
print(n) # array([1, 4, 2, 3, 5])
print(type(n)) # 类型:numpy.ndarray
print(n.shape) # 形状:(5,)
# 优先级: str > float > int
n=np.array([3.14,2,'hello'])
print(n) # array(['3.14', '2', 'hello'], dtype='<U32')
# 注意:
'''
①. numpy默认ndarray的所有元素的类型是相同的。
②. 如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str>float>int
③. ndarray的常见数据类型:
int: int8、uint8、int16、int32、int64
float: float16、float32、float64
str: 字符串
'''
2. 使用np的常规函数创建
# 1. np.onse(): 创建一个所有元素都为 1 的多维数组
# 语法: np.ones(shape,dtype=None,order='C')
# 示例:
n = np.ones(shape=(3,4))
print(n) # 3行4列
n = np.ones(shape=(3,4,5),dtype=np.int16)
print(n) # 3个4行5列的数组
# 参数说明:
'''
①. shape: 形状
②. dtype=None: 元素类型
③. order: {'C','F'},可选,默认值:C,是否在内存中以行主(C-风格) 或列主(Fortran-风格),一般默认即可
'''
# 2. np.zeros(): 创建一个所有元素都为 0 的多维数组
# 语法: np.zeros(shape,dtype=float,order='C')
# 示例:
n = np.zeros((5,5),dtype=np.int16)
print(n) # 5行5列
# 参数说明:
'''
①. shape: 形状
②. dtype=None: 元素类型
'''
# 3. np.full(): 创建一个所有元素都为 指定元素 的多维数组
# 语法: np.full(shape,fill_value,dtype=None,order='C')
# 示例:
n = np.full(shape=(3,4),fill_value=8)
print(n) # 3行4列的8
# 参数说明:
'''
①. shape: 形状
②. fill_value: 填充值
③. dtype=None: 元素类型
'''
# 4. np.eye(): 对角线为 1 ,其他位置为 0 的二维数组
# 语法: np.eye(N,M=None,k=0,dtype=None)
# 示例:
# 单位矩阵: 主对角线都是1,其他都是0
n = np.eye(6,6,dtype=np.int8)
# k=2: 向右偏移2个位置
n = np.eye(6,6,k=2,dtype=np.int8)
# k=-2: 向左偏移2个位置
n = np.eye(6,6,k=-2,dtype=np.int8)
print(n) # 6行6列
# 参数说明:
'''
①. N: 行数
②. M: 列数,默认为None,表示和行数一样
③. k=0: 向右偏移0个位置
④. dtype=None: 元素类型
'''
# 5. np.linspace(): 创建一个等差数列
# 语法: np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)
# 示例:
# 等差数列: 1,3,5,7,9就是等差数列
n = np.linspace(0,100,num=51,dtype=np.int16)
print(n) # 0,2,4,6,..100
# 参数说明:
'''
①. start: 开始值
②. stop: 结束值
③. num=50: 等差数列中默认有50个数
④. endpoint=True: 是否包含结束值
⑤. retstep=False: 是否返回等差值(步长)
⑥. dtype=None: 元素类型
'''
# 6. np.arange(): 创建一个数值范围的数组,和python中的range功能类似
# 语法: np.arange(start,stop,step,dtype=None)
# 示例:
n = np.arange(10)
print(n) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 参数说明:
'''
①. start: 开始值(可选)
②. stop: 结束值(不包含)
③. step: 步长(可选)
④. dtype=None: 元素类型
'''
# 7. np.random.randint(): 创建一个随机整数的多维数组
# 语法: np.random.randint(low,high=None,size=None,dtype='l')
# 示例:
n = np.random.randint(3,10)
print(n) # 获取1个随机整数
n = np.random.randint(3,10,size=6)
print(n) # 获取一维随机整数
n = np.random.randint(3,10,size=(3,4))
print(n) # 获取二维随机整数:3行4列
n = np.random.randint(0,256,size=(20,40,3))
print(n) # 获取三维随机整数:20个 40行3列
plt.imshow(n) # 根据数组显示图片
# 参数说明:
'''
①. low: 最小值
②. high=None: 最大值
high=None时,生成的数值在[0,low]区间内
如果使用high这个值,则生成的数值在[low,high]区间
③. size=None: 数组形状,默认只输出一个随机值
④. dtype=None: 元素类型
'''
# 8. np.random.randn(): 创建一个服从 标准正态分布 的多维数组
# 标准正态分布又称为u分布,是以0为均数、以1为标准差的正态分布,记为N(0,1)
# 标准正态分布,在0左右出现的概率最大,越远离出现的概率越低
# 语法: np.random.randn(d0,d1,...,dn)
# 示例:
n = np.random.randn()
print(n) # 产生一个随机数
n = np.random.randn(10)
print(n) # 一维数组: 十个随机数
n = np.random.randn(3,4)
print(n) # 二维数组: 3行4列
# 参数说明:
'''
①. dn: 第n个维度的数值
'''
# 9. np.random.normal(): 创建一个服从 正态分布 的多维数组
# 语法: np.random.normal(loc=0.0,scale=1.0,size=None)
# 示例:
n = np.random.normal()
print(n) # 产生一个0左右随机数
n = np.random.normal(loc=100)
print(n) # 产生一个100左右随机数
n = np.random.normal(loc=100,scale=10,size=(3,4))
print(n) # 二维数组
# 参数说明:
'''
①. loc=0.0: 均值,对应着正态分布的中心
②. scale: 标准差,对应分布的宽度,scale越大,正态分布的曲线越矮胖,scale越小,曲线越瘦高
③. size=None: 数组形状
'''
# 10. np.random.random(): 创建一个元素为 0-1(左闭右开) 的随机数的多维数组
# 语法: np.random.random(size=None)
# 示例:
n = np.random.random()
print(n) # 产生一个0-1的随机数
n = np.random.random(size=(3,4))
print(n) # 二维数组: 3行4列
# 参数说明:
'''
①. size=None: 数组形状
'''
# 11. np.random.rand(): 创建一个元素为 0-1(左闭右开) 的随机数的多维数组
# 和np.random.random功能类似,掌握其中一个即可
# 语法: np.random.rand(d0,d1,...,dn)
# 示例:
n = np.random.rand()
print(n) # 产生一个0-1的随机数
n = np.random.rand(3,4)
print(n) # 二维数组: 3行4列
# 参数说明:
'''
①. dn: 第n个维度的数值
'''
三. NumPy数组常用属性
ndim:维度
shape: 形状(各维度的长度)
size:总长度
dtype: 元素类型
# 读取图片
img_data = plt.imread('123.jpg')
# 1. 查看图片形状
img_data.shape # 三维数组:(421,725,3)
"""
第一个维度: 421
第二个维度: 725
第三个维度: 3
有几个数字就表示 几维
"""
# 2. 返回维度数
img_data.ndim # 维度:3
# 3. 总数据量
img_data.size # 915675: 总数量 = 421(一维度) * 725(二维度) * 3(三维度)
# 4. 元素类型
img_data.dtype # uint8: 无符号整数,8位表示1个字节 0000 0000
四. NumPy数组基本操作
1. 索引
# 一维与列表完全一致, 多维时同理
# 1. 一维
n = np.array([1,2,3,4,5])
n[0],n[-1] # 取第一个和倒数第一个
# 2. 二维
n = np.random.randint(0,10,size=(4,5))
n[3][4], n[-1][-1] # 取最后行最后一个
# 简写
n[3,4], n[-1,-1]
# 三维
n = np.random.randint(0,100,size=(4,5,6))
n[1,2,-1] # 第二块的第二行最后一个
# 根据索引修改数据
n[1,2,-1] = 886 # 直接改,修改一个数
m[1,2] = [1,2,3,4,5,6] # 修改一行数
m[1,2] = 100 # 直接修改一行数,都改为10
2. 切片
# 一维与列表完全一致, 多维时同理
# 一维
n=np.array([1,2,3,4,5])
print(n[2:6],n[::-1]) # 切片和反转
# 二维或多维
n = np.random.randint(0,10,size=(6,8))
# 行
# 取一行:索引
print(n[0])
# 取连续多行: 切片
print(n[1:4])
# 取不连续多行: 中括号
print(n[[1,2,4]])
# 列
# 取一列
print(n[1:4,0]) # 取所有行, 和第0列
# 取连续多列: 切片
print(n[:, 2:5])
# 取不连续多列: 中括号
print(n[:,[1,2,4]])
3. 练习:将图片反转
# 导入三剑客
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 二维 或 多维
n = np.random.randint(0,100,size=(6,8))
print(n) # 二维数组
n[::-1] # 行翻转
n[:,::-1] # 列翻转: 相当于是对第二个维度做翻转
# 翻转图片
dog = plt.imread('123.jpg') # 获取同目录下的图片数据
dog.shape # 查看是几维数据: 3维
plt.imshow(dog) # 展示原图
plt.imshow(dog[::-1]) # 行翻转: 上下翻转
plt.imshow(dog[:,::-1])# 列翻转: 左右翻转
plt.imshow(dog[:,:,::-1]) # 对颜色翻转: RGB => BGR
plt.imshow(dog[::10,::10,::-1]) # 也可以取仅需的
4. 变形-reshape()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
n = np.arange(1,21)
n # 一维列表
n.shape # 查看数组形状: (20,)
# 变成二维 reshape(数组,(形状))
n2 = np.reshape(n,(4,5))
n2 # 将上面一维数组变成4行5列二维数组,注意: 数组长度要对应,否则会报错
n2.shape # 查看数组形状:(4, 5)
n2.reshape((5,4)) # 5行4列
n2.reshape(5,4) # 5行4列
# 变成一维
# 使用-1: 表示任意剩余维度长度
n2.reshape(20) # 一维
n2.reshape(-1) # 一维
n2.reshape(4,-1) # 4行5列
n2.reshape(5,-1) # 5行4列
n2.reshape(-1,2) # 10行2列
n2.reshape(-1,1) # 20行1列
n2.reshape(2,-1,2) # 2组 5行2列
5. 级联合并-concatenate()
# 参数是列表或元组
# 级联的数据维度必须相同
# 可通过改axis参数改变级联方向
n1 = np.random.randint(0,100,size=(3,5))
n2 = np.random.randint(0,100,size=(3,5))
# 1. np.concatenate
# 级联, 合并
np.concatenate((n1,n2)) # 默认上下合并
np.concatenate((n1,n2),axis=0) # 上下合并 axis=0表示第一个维度(行)
# 左右合并 axis=1表示第二个维度(列)
np.concatenate((n1,n2),axis=1)
# 2. np.hstack
# np.hstack: 左右合并,水平级联
np.hstack((n1,n2))
# 3. np.vstack
# np.vstack: 上下合并,垂直级联
np.vstack((n1,n2))
6. 拆分-split()
n = np.random.randint(0,100,size=(6,4))
n # 生成一个6行4列的二维数组
#1. split
# split: 可以做水平或垂直拆分
# axis=0 行
# axis=1 列
np.split(n,2) # 默认按行拆分
np.split(n,2,axis=0) # 按行拆分
np.split(n,2,axis=1) # 按列拆分
# 2. vsplit
# 垂直拆分,按行平均拆成3份
np.vsplit(n,3)
# 可以按照指定位置拆分
np.vsplit(n,(1,2,4))
# 3. hsplit
# 水平方向按列拆分
np.hsplit(n,2)
# 4. 练习:把图片拆分
# 拆分必须是复数0,2,4,6...
dog = plt.imread('123.jpg')
dog.shape # 查看维度;(42, 51, 4)
# dog2=dog[:-1]# 切完后,可以将非复数转换成复数,不包含最后一行
# dog2.shape
dog2=dog[:,:-1] # 切完后,可以将非复数转换成复数,不包含最后一列
dog2.shape # (42, 50, 4)
# 垂直拆分
dog3 = np.split(dog,2)
dog3[0] # 上半部分
dog3[1] # 下半部分
plt.imshow(dog3[1]) # 查看图片
# 水平拆分
dog4 = np.split(dog2,5,axis=1)
plt.imshow(dog4[2])
7. 复制和深拷贝-copy()
# 1. 赋值: 用的是同一个内存
n = np.arange(10)
n2=n
n2[0]=100
display(n,n2) # display: 打印
# 2. 深拷贝-一维: copy
n1 = np.arange(10)
n2 = n1.copy()
n2[0]=100
display(n1,n2)
# 3. 深拷贝-二维: copy
n = np.random.randint(0,10,size=(2,3))
n2=n.copy()
n2[0][0]=100
display(n,n2)
8. 聚合函数
# 1. 求和np.sum
n = np.arange(10) # 一维数组
np.sum(n)
n = np.random.randint(0,10,size = (3,4)) # 二维数组
np.sum(n) # 所有数的和
# axis=0: 表示每一列的多行求和
np.sum(n,axis=0)
# axis=1: 表示每一行的多列求和
np.sum(n,axis=1)
# 2. 其他常见函数
n = np.random.randint(0,10,size = (3,4)) # 二维数组
np.max(n) # 最大值
np.min(n) # 最小值
np.mean(n) # 平均值1
np.average(n) # 平均值2
np.median(n)# 中位数
np.percentile(n,q=50) # 百分位数, q=50 表示中位数
n = n.reshape(-1) # 将二维转换成一维数组
display(n)
np.argmax(n) #第一个最大值对应的下标
np.argmin(n) #第一个最小值对应的下标
np.argwhere(n==np.max(n)) # 按条件找到所有最大值的下标
np.power(n,3) # 次方: n**3 也可以
np.std(n) # 标准差
np.var(n) # 方差
# 3. np.sum 和 np.nansum(nan: not a number)
# nan: 数值类型, not a number:不是一个正常的数值,表示空
# np.nan : float类型
n = np.array([1,2,3,np.nan]) # 一维数组
np.sum(n) # 包含nan(空)类型, 无法求出和
np.nansum(n) # 排除掉nan之后, 剩下的数求和
五. 矩形操作
1. 基本矩形操作
# 1. 算术运算符: 加减乘除
n = np.random.randint(0,10,size=(4,5))
# 针对列表中所有数值
n+10 # 加
n-10 # 减
n*10 # 乘
n/10 # 除
n//2 # 整除
n**2 # 次方
n%2 # 余数
n1 = np.random.randint(0,10,size=(4,5))
n2 = np.random.randint(0,10,size=(4,5))
display(n1,n2)
# 两个二维矩阵运算
n1 + n2
n1 - n2
n1 * n2
...
2. 线性代数
# 1. 矩阵积np.dot()
# 注意:需要第一个矩阵的列数 等于 第二个矩阵的行数
n1 = np.random.randint(0,5,size=(2,3))
n2 = np.random.randint(0,5,size=(3,2))
display(n1,n2)
np.dot(n1,n2)
# 矩阵积详解
'''
[3, 0, 4],
[2, 1, 3]
[0, 2],
[1, 3],
[1, 1]
= [3*0+0*1+ 4*1, 3*2+0*3+4*1]
[2*0+1*1+ 3*1, 2*2+1*3+3*1]
=[4,10]
[4,10]
'''
# 2. 线性代数中其他矩阵操作
n = np.array([[1,2,3],
[2,5,4],
[4,5,8]])
# 矩阵逆
np.linalg.inv(n)
# 矩阵的行列式
np.round(np.linalg.det(n))
# 行列式计算: 矩阵的所有主对角线 - 所有副对角线
# 1*5*8 + 2*4*4 + 3*2*5 -(3*5*4 + 2*2*8 + 1*4*5) = -10
# 矩阵的秩 (满秩矩阵, 奇异矩阵)
np.linalg.matrix_rank(n)
3. 广播机制
# 为不同维度的矩阵尽量提供运算可能性
# 规则一: 为缺失的维度补维度
# 规则二: 缺失元素用已有值填充
# 1. 例一
m = np.ones((2,3),dtype=np.int8)
a = np.arange(3)
# 求 m+a
display(m,a)
m+a # 自动补充第二行,(复制下第一行),在进行计算
# 2. 例二
a = np.arange(3).reshape(3,1)
b = np.arange(3)
#求a+b
display(a,b)
a+b # 自动补充行和列
# 3. 例三
a = np.ones((4,1),dtype=np.int8)
b = np.arange(4)
#求a+b
display(a,b)
a+b # 自动补充行和列
4. 其他数学操作
# abs、sqrt、square、exp、log、sin、cos、tan、round、ceil、floor、cumsum
n =np.array([1,4,8,9,16,25,64])
np.abs(n) # 绝对值
np.sqrt(n) # 平方根, n**0.5 也可以
np.square(n) # 平方, n**2 也可以
np.exp(n) # 指数 e = 2.71828183
np.log(n) # 自然对数:以e为底的对数, ln3
np.log(np.e) # 1
np.log(1) # 0
np.log2(n) # 2 为底数的对数
np.log10(n) # 10为底数的对数,常用对数
np.sin(n) # 正弦
np.cos(n) # 余弦
np.tan(n) # 正切
np.round(n,2) # 四舍五入
np.ceil(n) # 向上取正
np.floor(n) # 向下取正
np.cumsum(n) # 累加求和
5. 排序
# 1. np.sort():不改变原数组
n1 = np.random.randint(0,10,size=6)
n2 = np.sort(n1) # 不改变原数组
# 2. ndarray.sort():改变原数组,不多占内存空间
n3 = np.random.randint(0,10,size=6)
n3.sort() # 修改原数组
6. 文件IO操作
# 1. 保存数组
# save:保存ndarray到一个npy文件
# savez: 将多个array保存到一个npz文件中
x = np.arange(5)
y = np.arange(10,20)
# save
np.save('x',x) # 保存后,自动生成一个 x.npy的文件
#savez
np.savez('arr.npz',xarr=x,yarr=y ) # 保存后,自动生成一个 arr.npz的文件
# 2. 读取数组
#读取 npy文件
np.load('x.npy')
# 读取 npz文件
np.load('arr.npz')["xarr"]
# 3. csv,txt文件的读写操作
n = np.random.randint(0,10,size=(3,4))
# 存储到 csv 或 txt
# delimiter=',':分隔符
np.savetxt('arr.csv',n,delimiter=',')
# 读取csv 或 txt
np.loadtxt('arr.csv',delimiter=',',dtype=np.int16,converters=float)
标签:10,09,random,基础,print,数组,np,n2,NumPy
From: https://www.cnblogs.com/kh-1314/p/18050483