numpy基础

本文详细介绍了numpy的基本概念,包括创建数组、数据类型管理、数学运算、函数创建、读写操作、数组级联与切分、基本运算原则、聚合函数、数组操作、数学函数、统计分析、查找与排序,以及矩阵处理和数据保存。适合初学者了解numpy在数值计算中的核心应用。
摘要由CSDN通过智能技术生成

numpy基础介绍

1.numpy简介

  • 一个基于python的扩展库
  • 提供高维数组对象ndarry,运算速度碾压python list
  • 提供了各种高级数据编程工具,如:矩阵运算,向量运算,快速筛选,IO操作,傅里叶变换,线性代数,随机数等
  • numpy是python语言中做科学计算的基础库.重在与数值计算,也是大部分python科学计算库的基础,多用于在大型,多维数组上执行的数值运算

2.numpy创建

2.1numpy属性

  • ndim:维度

  • shape:形状(各维度的长度)

  • size:总长度

  • dtype:元组类型

  • 创建【np.array()】

    import numpy as np
      # 使用array()创建多维数组,arr2(2维)
    arr2=np.array([[1,2,3],[1,2,3]])
    arr=np.arry([1,2,3])
    arr.ndim  1
    arr.shape  (3,)
    arr.size   3
    arr.dtype   int32
    

2.2 numpy强制数据类型统一

  • numpy设计初衷是用于运算,所以对数据类型进行了统一化

  • 数组和列表的区别是什么?

    • 数组中存储的数据元素类型必须是同一类型
    • 优先级:字符串>浮点型>整型
  • 注意

    • numpy默认ndarry的所有元素的类型是相同的
    • 如果传进来的列表中包含不同类型的类型,则统一为同一类型【优先级:字符串>浮点型>整型】
    # 例一,有int和float类型,数组为float类型
    list1=[1,2,3,3.14]
    arr3 = np.array(list1)
    arr3.dtype   #dtype('float64')
    
    #例二有int和float和str类型,数组为str类型
    list2=[1,2,3,3.14,'object']
    arr4=np.array(list2)
    # U 表示Unicode的简写形式
    arr4.dtype   dtype('<U32')
    

2.3 numpy数据类型

在这里插入图片描述

2.4 数据类型设置与修改

  • array(dtype=?):可以设定数据类型
  • arr.dtype = ‘?’:可以修改数据类型

3.numpy函数创建

  • 1.np.ones(shape,dtype=None,order='C')

    创建元素全为1的arr数组
    shape;形状,使用元组表示
    dtype:数据类型
    
    np.ones(shape=(2,3))
    array([[1., 1., 1.],
           [1., 1., 1.]])
           
    np.ones(shape=(3,))
    array([1., 1., 1.]) 一行三列
    
    np.ones(shape=(1,3))
    array([[1., 1., 1.]]) 一列三行
    
    np.ones(shape=(3,2),dtype=np.int8) 设置数组数据类型
    array([[1, 1],
           [1, 1],
           [1, 1]], dtype=int8)
    
  • 2.np.zeros(shape,dtype=None,order='C')

    创建元素全为0的arr数组
    shape;形状,使用元组表示
    dtype:数据类型
    
    np.zeros(shape=(3,1),dtype=np.uint8)
    array([[0],
           [0],
           [0]], dtype=uint8)
    
  • 3.np.full(shape,fill_value,dtype=None,order='C')

    创建元素全为fill_value的arr数组
    shape;形状,使用元组表示
    fill_value:要填充的内容
    dtype:数据类型
    
    np.full(shape=(3,3),fill_value=9)
    array([[9, 9, 9],
           [9, 9, 9],
           [9, 9, 9]])
    
  • 4.np.eye(N,M=None,k=0,dtype=float)

    创建单位矩阵【单位矩阵是对角线为1,其他数值为0的矩阵】
    M:取几列
    N:行列个数
    k:偏移量,-1,向下,1,向上
    
    np.eye(N=4)
    array([[1., 0., 0., 0.],
           [0., 1., 0., 0.],
           [0., 0., 1., 0.],
           [0., 0., 0., 1.]])
           
    np.eye(N=4,M=2)
    array([[1., 0.],
           [0., 1.],
           [0., 0.],
           [0., 0.]])
    np.eye(N=3,k=-1)       
    array([[0., 0., 0.],
           [1., 0., 0.],
           [0., 1., 0.]])
    
  • 5.np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)

    创建等差数列
    start:开始数值
    stop:结束数值
    num:取几个数
    endpoint:结束数值是否取到,默认True是取
    
    np.linspace(0,100,10,endpoint=False)
    array([ 0., 10., 20., 30., 40., 50., 60., 70., 80., 90.])
    
  • 6.np.arange([start],stop,[step],dtype=None)

    创建等差数列
    start:开始数值
    stop:结束数值
    step:步长
    
    np.arange(0,100,step=10)
    array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
    
  • 7.np.random.randint(low,high=100,size=(3,5))

    low:最低值
    hight:最高值,取不到
    size;数组维度,例如(3,5)表示34列
    
    np.random.randint(low=0,high=100,size=(3,5))
    array([[10, 77, 88, 98,  1],
           [63, 88, 74, 52, 95],
           [72, 32, 47, 54, 41]])
    
  • 8.正态分布函数

    • np.random.randn(d0,d1...dn)标准正态分布

      d0,d1,...dn表示数值
      标准正态分布,均值为0,方差为1
      
      np.random.randn(10)
      array([ 0.90932901, -1.07434733,  1.26531975, -1.04664126,  0.55071226,
             -0.52273185, -1.12773703, -0.70790686, -0.44364692, -0.58383712])
      
    • np.random.normal(loc,scale,size)普通正态分布

      loc:均值
      sclae;方差
      size;维度
      
      np.random.normal(loc=175,scale=10,size=(10,))
      array([179.71415307, 194.71274934, 188.3090508 , 179.33343346,
             171.81593491, 183.71192878, 160.59071737, 168.3842981 ,
             174.44115747, 162.83943842])
      
  • 9.np.random.random(size=None)

    生成0-1的随机数,左闭右开
    
    np.random.random(size=(2,3))
    array([[0.97479452, 0.90471601, 0.06254445],
           [0.3465683 , 0.01054765, 0.04036137]])
    
  • 10.np.random.permutation(10)生成随机索引

    np.random.permutation(5)
    array([0, 3, 1, 4, 2])
    
  • 11.np.random.seek()随机种子

    种子不变,随机值不会变
    np.random.seed(1)
    np.random.randint(0,10,size=5)
    array([5, 8, 9, 5, 0])
    

4.np读写操作

  • 1.切片操作:
    arr = np.random.randint(0, 100, size=[5, 4])
    arr[0]# 索引取元素,取出第一行元素
    arr[:, :2]    # 切出前两列数据
    arr[:2, :]     # 切出前两行数据
    arr[:2, :2]    # 切出前两行的前两列数据
    arr[::-1]       # 数组行数据翻转
    arr[:, ::-1]     # 数组列数据翻转
    arr[::-1, ::-1]       # 数组行和列数据都翻转
    

ndarray的高维数组访问,使用[dim1_index, dim2_index…]

dim_index支持的形式 : int [int] 切片 bool列表

  • 索引访问

    arr4=np.random.randint(0,10,size=10)
    array([9, 5, 1, 9, 8, 1, 3, 5, 9, 7])
    arr4[0],arr4[-1]   (9, 7)
    arr4[1]=100   #重新赋值
    arr4
    array([  9, 100,   1,   9,   8,   1,   3,   5,   9,   7])
    
    arr5=np.random.randint(0,10,size=(3,4))
    array([[1, 1, 3, 5],
           [4, 3, 8, 1],
           [1, 9, 2, 0]])
    arr5[1][3]    5  #属于间接访问
    arr5[1,3]     直接访问
    
  • 列表访问

    arr1 = np.random.randint(0, 100, size=10)
    array([ 3, 85, 47,  1, 56, 67, 77, 68, 40, 98])
    arr1[[1,3]]
    结果:array([57, 19])
    
  • 切片访问

    arr1=np.random.randint(0,10,size=(3,4))
    array([[7, 1, 2, 6],
           [0, 0, 3, 1],
           [5, 3, 3, 4]])
           
    arr1[0:2]
    array([[7, 1, 2, 6],
           [0, 0, 3, 1]])
    
  • bool访问

    arr3=np.random.randint(0,100,size=(5,))
    结果:array([20, 81, 96, 66, 62])
    
    bool_index = [False, True, False, True, False]
    arr3[bool_index]
    结果:array([81, 66])
    

5.ndarray的级联和切分

5.1级联注意事项

  • 将多个numpy数组进行横向或纵向拼接
  • 级联的参数是列表:一定要加中括号或小括号
  • 维度必须相同,形状相符
    • 行一样列不一样,只能使用行级联
    • 列一样行不一样,只能使用列级联
    • 行列都一样,行列都可以级联
- (以伪数组级联默认axis=0,默认为列)
- 级联的方向默认是shape这个tuple的第一个值所代表的维度方向
- 可通过axis参数改变级联的方向【  0列        1行】

5.2 级联函数

np.concatenate()
  参与级联的数组必须维度一致
  axis:0,向下级联(竖直)1,向左级联(水平),默认为0
  a1 = np.random.randint(0, 10, size=(3,4))
  a2 = np.random.randint(10, 20, size=(3,4))
  np.concatenate((a1,a2),axis=0)
  array([[ 3,  3,  9,  0],
         [ 2,  8,  2,  5],
         [ 3,  9,  8,  6],
         [16, 16, 10, 11],
         [16, 16, 19, 15],
         [16, 18, 14, 15]])
         
  a1 = np.random.randint(0, 10, size=(3,4))
  array([[3, 3, 9, 0],
         [2, 8, 2, 5],
         [3, 9, 8, 6]])
  a4 = np.random.randint(30,40, size=(3,3))
  array([[38, 33, 31],
         [37, 39, 38],
         [33, 33, 38]])
  np.concatenate((a1, a4), axis=1)
  array([[ 3,  3,  9,  0, 38, 33, 31],
         [ 2,  8,  2,  5, 37, 39, 38],
         [ 3,  9,  8,  6, 33, 33, 38]])
np.hstack()
    # 横着连接,相当于axis=1
    np.hstack((a1, a4))
np.vstack()
    a1= np.random.randint(30,40, size=(3,2))
    a2= np.random.randint(30,40, size=(4,2))
    array([[35, 34],
           [33, 34],
           [32, 36]])
           
    array([[37, 35],
           [39, 37],
           [32, 35],
           [37, 38]])
           
    np.vstack((a1,a2))
    array([[31, 35],
           [34, 34],
           [33, 37],
           [39, 36],
           [34, 36],
           [34, 35],
           [36, 37]])

5.3切分函数

np.split()
 将数组切分2分,获得2个新的数组
 indices_or_sections 是int 会按照指定的轴向,讲数组切分成N等分
 要求切分的方向上的长度能被N整除
 arr = np.random.randint(0, 100, size=(6,5))
 a1,a2=np.split(arr,indices_or_sections=2,axis=0)
 display(a1, a2)
 array([[79, 75, 99, 80, 75],
        [54, 87, 34,  7, 70],
        [90, 11, 78, 54,  4]])
 array([[71, 70, 47,  0, 45],
        [82, 14, 36, 81, 77],
        [13, 45, 96, 18, 46]])
        
 将数组分为3分,2;前两列为一个数组,3代表第三列为一个数组,后面剩余的为一个数组     
 np.split(arr, indices_or_sections=[2,3], axis=1)
 [array([[79, 75],
         [54, 87],
         [90, 11],
         [71, 70],
         [82, 14],
         [13, 45]]),
  array([[99],
         [34],
         [78],
         [47],
         [36],
         [96]]),
  array([[80, 75],
         [ 7, 70],
         [54,  4],
         [ 0, 45],
         [81, 77],
         [18, 46]])]
np.vsplit()
    水平切
    arr = np.random.randint(0, 100, size=(6,5))
    np.vsplit(arr, indices_or_sections=2)
    [array([[79, 75, 99, 80, 75],
            [54, 87, 34,  7, 70],
            [90, 11, 78, 54,  4]]),
     array([[71, 70, 47,  0, 45],
            [82, 14, 36, 81, 77],
            [13, 45, 96, 18, 46]])]
np.hsplit()
 # 竖直切
 np.hsplit(arr, indices_or_sections=[2,3])
 [array([[79, 75],
         [54, 87],
         [90, 11],
         [71, 70],
         [82, 14],
         [13, 45]]),
  array([[99],
         [34],
         [78],
         [47],
         [36],
         [96]]),
  array([[80, 75],
         [ 7, 70],
         [54,  4],
         [ 0, 45],
         [81, 77],
         [18, 46]])]

6.基本运算原则

  • 两个矩阵运算,就是对应位置的数据的运算

    arr = np.random.random(10)
    arr2 = np.random.randint(0,10,size=10)
    维度相同,可以运算
    arr + arr2
    可以运算,10维
    arr+1
    
    
  • 广播Broadcast

    • ndarry广播机制的两条规则

      • 两个数组的后缘维度(trailing dimension,即从末未开始算起的维度)的轴长度相符
      • 或其中一方的长度为1

      则认为它们是广播兼容,广播会在缺失和(或)长度为1的维度上进行

      1:
      a = np.ones((2, 3)) 
      b = np.arange(3) 求a + b
      a后缘为3与b后缘为3相符,符合,不报错
      
      例2:
      a = np.ones((4,3,2))
      b = np.random.randint(0,10,size=(3,2)), 求a+b
      a后缘为32与b后缘为3,2相符,符合,不报错
      
      例3:
      a = np.arange(3).reshape((3, 1))
      b = np.arange(3), 求a+b
      b的长度为1,符合
      

7.聚合函数操作

  • 求和np.sum()

    data = np.random.randint(0, 10, size=(3,2))
    array([[0, 7],
           [8, 0],
           [1, 6]])
    data.sum() 22求所有和
    data.sum(axis=1) 求每一行的和
    array([12,  5,  6])
    
  • 空值np.nan

    np.nan是float类型
    在求和中出现nan,和会为nan
    
  • np.sum()与np.nansum()区别

    np.sum()在求和中出现nan,和会为nan
    np.nansum(),和为真正数值
    
  • 最大值与最小值np.max(),np.min()

    arr = np.random.randint(0, 10, size=(3,2))
    arr.max(), arr.min()
    (9, 2)
    
  • any()

    data=np.random.randint(0,2,size=5).astype(np.bool)
    array([False, False,  True, False,  True])
    有真即真
    data.any()
    True
    
  • all()

    data=np.random.randint(0,2,size=5).astype(np.bool)
    array([False, False,  True, False,  True])
    有假即假
    data.all()
    False
    
  • 常见聚合函数

    Function Name	  NaN-safe Version			Description
    np.sum				np.nansum				Compute sum of elements
    np.prod				np.nanprod				Compute product of elements
    np.mean				np.nanmean				Compute mean of elements
    np.std				np.nanstd				Compute standard deviation
    np.var				np.nanvar				Compute variance
    np.min				np.nanmin				Find minimum value
    np.max				np.nanmax				Find maximum value
    np.median			np.nanmedian			Compute median of elements
    np.percentile		np.nanpercentile		Compute rank-based statistics of elements
    np.any				N/A						Evaluate whether any elements are true
    np.all				N/A						Evaluate whether all elements are true
    
    

8 np数组操作函数

8.1添加元素

  • np.append函数在数组的末尾添加值,追加操作会分配整个数组,并把原来的数组复制到新的数组中
  • 注意
    • 插入的维度要保证所有的长度是相同的
    • 如果没有指定轴,会扁平化处理【变成一维】
arr=np.random.randint(0,5,5)
arr=np.append(arr,8)
array([2, 3, 4, 3, 0, 8])

arr2 = np.random.randint(0, 10, size=(4,3
array([[8, 2, 4],
       [0, 0, 7],
       [4, 4, 1],
       [9, 5, 5]])
#添加的是二维数据
np.append(arr2, [[1,2,3]], axis=0)
array([[8, 2, 4],
       [0, 0, 7],
       [4, 4, 1],
       [9, 5, 5],
       [1, 2, 3]])

8.2插入元素

  • np.insert函数在给定索引之前,沿给定轴在输入数组中插入值
  • 如果没有提供轴,则输入数组会被展开
arr=np.random.randint(0,5,5)
array([3, 2, 0, 4, 0])
np.insert(arr, 2, 100)   2是索引
array([  3,   2, 100,   0,   4,   0])

arr2 = np.random.randint(0, 10, size=(4,3))
array([[0, 8, 4],
       [8, 2, 3],
       [7, 3, 6],
       [9, 7, 2]])
#插入的是一维数据
np.insert(arr2, 2, [1,1,1], axis=0)
array([[0, 8, 4],
       [8, 2, 3],
       [1, 1, 1],
       [7, 3, 6],
       [9, 7, 2]])

8.3删除元素

  • np.delete函数返回从输入数组中删除指定字数组的新数组
  • 如果没有提供轴,则输入数组会被展开
arr=np.random.randint(0,5,5)
array([3, 3, 2, 1, 0])
np.delete(arr, 1)  1是索引
array([3, 2, 1, 0])

arr2 = np.random.randint(0, 10, size=(4,3))
array([[7, 3, 1],
       [8, 6, 3],
       [4, 2, 7],
       [3, 9, 6]])
删除索引为1的行数据
np.delete(arr2, 1, axis=0)
array([[7, 3, 1],
       [4, 2, 7],
       [3, 9, 6]])

8.4数组变形reshape

  • np.reshape函数可以在不改变数据的条件下修改形状,格式如下:np.reshape(arr,newshape,order=“C”)
    • arr,要修改的数组
    • newshape:整数或者整数数组,新的形状应当兼容原有形状
    • order:‘C’:按行,“F”:按列,“A”:原顺序,“k”:元素在内存中的出现顺序
arr = np.random.randint(0, 10, size=8)
arr.reshape((2,4), order='C')
array([[0, 5, 6, 4],
       [5, 1, 5, 0]])
       
arr.reshape((2,4),order='F')
array([0, 5, 6, 4, 5, 1, 5, 0])
array([[0, 6, 5, 5],
       [5, 4, 1, 0]])

8.5数组迭代器

  • np.flat
一层循环就可以取多维数据
arr2 = np.random.randint(0, 10, size=(4,3))
for i in arr2.flat:
    print(i)

8.6数据扁平处理

  • np.ndarray.flatten()返回一份展开的数组拷贝,对拷贝所做的修改不会影响原始数组
  • np.ravel(),展平的数组元素,返回一个展开的数组引用,修改会影响原始数组
arr2 = np.random.randint(0, 10, size=(4,3))
array([[8, 3, 9],
       [8, 0, 4],
       [2, 6, 0],
       [1, 9, 5]])
arr2.flatten()
arr2.ravel()
array([8, 3, 9, 8, 0, 4, 2, 6, 0, 1, 9, 5])

8.7数组翻转

  • np.transpose对换数组维度
arr2 = np.random.randint(0, 10, size=(4,3))
array([[8, 3, 9],
       [8, 0, 4],
       [2, 6, 0],
       [1, 9, 5]])
行变列,列变行,
1代表列,0代表行
[第一个行,第二个列]
arr2.transpose([1,0])
array([[8, 8, 2, 1],
       [3, 0, 6, 9],
       [9, 4, 0, 5]])

9.np数学函数

  • np.sin(),np.cos(),np.tan()
  • 接受的参数是弧度,不是角度
  # 生成一个取值范围在 -pi ~ pi 之间的数组
  data=np.random.random(size=10)*2*np.pi-np.pi
  np.sin(np.pi/2)
  1.0
  • 舍入函数
    • np.around()
      • a:数组
      • decimals:舍入的小数位,默认为0,如果为负,整数将四舍五入到小数点左侧的位置
  data = np.random.random(size=2)
  array([0.65102312, 0.29791106])
  np.around(data, 3)
  array([0.651, 0.298])
  • 算数函数
    • 加减乘除,add(),subtract(),mutiply(),dvide()
    • np.power(),幂运算,可以做开方运算
    • np.mode(),求余运算
    • np.log(),自然底数的对数
  a1 = np.random.randint(0, 10, size=(5,3))
  b1 = np.random.randint(0, 10, size=3)
  np.add(a1, b1)  广播机制,可以加

10.常见的统计函数

  • numpy.amin() 和 numpy.amax(),用于计算数组中的元素沿指定轴的最小、最大值。
  • numpy.ptp():计算数组中元素最大值与最小值的差(最大值 - 最小值)。
  • numpy.median() 函数用于计算数组 a 中元素的中位数(中值)
  • 标准差std():标准差是一组数据平均值分散程度的一种度量。
    • 公式:std = sqrt(mean((x - x.mean())**2))
  • 方差var():统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数,即 mean((x - x.mean())** 2)。换句话说,标准差是方差的平方根。

11.np查找与排序

查找索引

  • np.argmax(),np.argmin()
data = np.random.randint(0, 100, size=10)
data.argmax(), data.argmin()

条件查找

  • np.where(),函数返回输入数组中满足给定条件的索引
data = np.random.randint(0, 100, size=10)
np.where( data > 60) 返回索引

快速排序

  • np.sort(),不改变输入
  • ndarray.sort()本地处理,不占用空间,但改变输入,返回输入数组的排序副本
np.sort(arr)
arr.sort()

索引排序

  • np.argsort(),函数返回的是数组值从小到大的索引值
np.argsort(data)

部分排序

  • np.partition(a,k)
    • 有时候我们不需要把数据全部排序,可能只对最小或最大的数据感兴趣
    • k为正时,得到最小的k个值
    • k为负时,得到最大的k个值
data = np.random.randint(0, 100, size=10)
array([5216,  965, 4432, ..., 9818, 7564, 8769])
np.partition(data, -2)
array([9998, 9999])
np.partition(data, 2)[:2]
array([0, 1])
  • 矩阵是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为1,除此之外全都为0

12.矩阵

  • numpy中包含了一个矩阵库numpy.matlib,该模块中的函数返回的是一个矩阵,而不是ndarray对象
  • 一个的矩阵是一个由行(row)列(column)元素排列成的矩形阵列
  • numpy.matlib.identity()函数返回给定大小的单位矩阵

13. 数据保存及读取

  • 数据保存
    import numpy as np
    
    # 生成一个numpy数组
    data = np.array([[1,2,3], [4,5,6], [7,8,9]])
    
    # 保存为npy格式
    np.save('data.npy', data)
    
  • 数据读取
    import numpy as np
    
    # 读取npy文件
    loaded_data = np.load('data.npy')
    
    # 打印数据
    print(loaded_data)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荼靡~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值