首页 > 其他分享 >09-NumPy-基础

09-NumPy-基础

时间:2024-03-07 11:25:11浏览次数:24  
标签:10 09 random 基础 print 数组 np n2 NumPy

一. 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

相关文章

  • Python爬虫学习记录1—Python基础知识
    1.type()函数:用于查看变量的数据类型print(type(a),a)2.input()函数:输入内容用户的交互程序如果没有结束,则需要输入内容注意:input接受的所有数据都是字符串,字符串如果想变成其他数据类型则需要转化3.ifPython用缩进代替判断括号缩进:捆绑同一层级别的代码,简称代码块if单分......
  • Mysql 基础
    创建数据库CREATEDATABASENAME;创建表#中括号[]是可选的意思,命令中不带中括号CREATETABLEtable_name(column1datatype[NULLorNOTNULL][DEFAULT默认值][AUTO_INCREMENTPRIMARYKEY],column2datatype,...//上边没有PRIMARYKEY可以在最下......
  • 2252309------对飞机(航空)订票系统(C语言)进行逆向学习、分析、思考、设计构思、改进....
    **飞机订票系统**一、资料来源CSDN博主吴朋奉阅读量最高的一篇博文--飞机订票系统(C语言)----https://blog.csdn.net/weixin_47774641/article/details/111398063?spm=1001.2014.3001.5506二、运行环境Windows11+DEVC++三、源代码(来自博主吴朋奉)......
  • C语言基础-1、循环控制
    一、素数ex1:#include<stdio.h>intmain(){ intn; intflag=0;//标识符,0表示该数字是素数 scanf("%d",&n); inti=2; for(i;i<n;i++) { if(n%i==0) { flag=1; } } if(flag==0) { printf("%d是素数!\n",n); } else......
  • 卡码java基础课 | 9.打印正方形
    学习内容:通过一道题目来学习使用循环嵌套。例题:解:点击查看代码importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intn=sc.nextInt();for(intro......
  • 初中英语优秀范文100篇-099Keep patient when facing difficulties-面对困难时保持耐
    PDF格式公众号回复关键字:SHCZFW099记忆树1IstillrememberthefirsttimeIrodeabicyclewhenIwasseven.翻译我仍然记得我七岁时第一次骑自行车的情景简化记忆自行车句子结构主语I表示我谓语stillremember仍然记得宾语从句thefirsttimeIrodea......
  • 卡码java基础课 | 8.奇怪的信
    学习内容:通过一道题加深对取模和除法的理解例题:解:点击查看代码importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);while(sc.hasNext()){intnum......
  • 卡码java基础课 | 7.摆平积木
    学习内容:用一道题目来练习ArrayList的遍历和访问操作。例题:解:点击查看代码importjava.util.ArrayList;importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);in......
  • 零基础python编程基础
    1.计算机:脑力劳动工具                                       2. ......
  • Day03---Web前端基础
    JavaScript的使用Javascript的定义JavaScript是运行在浏览器端的脚步语言,是由浏览器解释执行的,简称js,它能够让网页和用户有交互功能,增加良好的用户体验效果。前端开发三大块1、HTML:负责网页结构2、CSS:负责网页样式3、JavaScript:负责网页行为,比如:网页与用户的交互......