zoukankan      html  css  js  c++  java
  • Numpy

    转自:波哥

    1、使用np.array()创建数组

    import numpy as np
    np.array([1,2,3,4,5])    # 创建一个一维数组
    np.array([1,2,3],[4,5,6])  # 创建一个二维数组
    
    # numpy默认ndarray的所有元素类型是相同的
    # 如果传进来的列表中包含不同的类型,则统一为统一类型,优先级:str > float > int

    2.使用np的函数创建数组

    import numpy as np
    
    
    # np.ones(shape, dtype=None, order='C')
    np.ones(shape=(5, 6), dtype=int) # 创建一个元素数值为1, 形状为5行5列的二维数组
    
    # np.zeros(shape, dtype=None, order='C')
    np.zeros((5, 5)) # 创建一个元素数值为0, 形状为5行5列的二维数组
    
    # np.full(shape, fill_value, dtype=None, order='C')
    np.full((5,5),fill_value=999) # 创建一个元素数值为999, 形状为五行五列的二维数组
    
    # np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
    np.linspace(1,100,num=50) # 创建一个元素数值范围在1到100, 元素个数为50的一维数组
    
    # np.arange([start, ]stop, [step, ]dtype=None)
    np.arange(0, 100, 2) #创建一个 元素数值范围为0到100,元素数值步长为2 的一维数组
    
    # np.random.randint(low, high=None, size=None, dtype='l')
    np.random.seed(1) # 使用random.seed()方法固定随机性
    np.random.randint(0, 100, size=(5, 6)) # 生成一个5行6列的二维数组, 每一个元素的值是0到100的随机数
    
    # np.random.randn(d0, d1, ..., dn)
    np.random.seed(1) # 固定随机性
    np.random.randn(4, 5, 6) # 标准正太分布
    
    # np.random.random(size=None)
    np.random.seed(1) # 固定随机性
    np.random.random(size=(3, 3)) # 生成0到1的随机数, 左闭右开

    3.ndarray的属性

    • 4个必须记住的参数:
      • ndim: 维度
      • shape: 形状(各维度的长度)
      • size: 总长度
      • dtype: 元素类型
    # 使用matplotlib.pyplot获取一个numpy数组,数据来源于一张图片
    import matplotlib.pyplot as plt
    img_arr = plt.imread('./wnh.jpg') # 读取图片数据,返回一个三维数组
    plt.imshow(img_arr) # 显示该图片
    
    
    img_arr.shape   # 数组的形状
    img_arr.size    # 数组的总长度
    img_arr.dtype   # 数组元素的类型
    img_arr.ndim    # 数组的维度(几维数组)

    4.ndarray的基本操作

    import numpy as np
    
    np.random.seed(1)
    arr = np.random.randint(0, 100, size=(5, 5)) # 创建一个元素范围是0到100,形状是5行5列的随机数组
    arr
    ##执行结果如下:
    array([[37, 12, 72,  9, 75],
           [ 5, 79, 64, 16,  1],
           [76, 71,  6, 25, 50],
           [20, 18, 84, 11, 28],
           [29, 14, 50, 68, 87]])

    (1)索引

    # 根据索引查看元素. 注意:索引从0开始计数.
    arr[0][0]
    
    
    ##执行结果如下:
    37
    
    # 根据索引修改元素数值
    arr[0][0] = 666
    arr
    
    
    ##执行结果如下:
    array([[666,  12,  72,   9,  75],
           [  5,  79,  64,  16,   1],
           [ 76,  71,   6,  25,  50],
           [ 20,  18,  84,  11,  28],
           [ 29,  14,  50,  68,  87]])
    
    
    

    (2)切片

    # 查看当前数组
    arr
    
    
    ##执行结果如下:
    array([[666,  12,  72,   9,  75],
           [  5,  79,  64,  16,   1],
           [ 76,  71,   6,  25,  50],
           [ 20,  18,  84,  11,  28],
           [ 29,  14,  50,  68,  87]])
    
    
    # 获取二维数组前两行
    arr[0:2]
    
    
    ##执行结果如下:
    array([[666,  12,  72,   9,  75],
           [  5,  79,  64,  16,   1]])
    
    
    # 获取二位数组前两列
    arr[:,0:2]
    
    
    ##执行结果如下:
    array([[666,  12],
           [  5,  79],
           [ 76,  71],
           [ 20,  18],
           [ 29,  14]])
    
    # 注意: 逗号左边是行切片, 右边是列切片
    # 获取二维数组前两行和前两列的数据
    arr[0:2, 0:2]
    
    
    ##执行结果如下:
    array([[666,  12],
           [  5,  79]])
    
    # 将数组的行 倒序排列
    arr[::-1,::]
    
    
    ##执行结果如下:
    array([[ 29,  14,  50,  68,  87],
           [ 20,  18,  84,  11,  28],
           [ 76,  71,   6,  25,  50],
           [  5,  79,  64,  16,   1],
           [666,  12,  72,   9,  75]])
    
    # 将数组的列 倒序排列
    arr[::, ::-1]
    
    
    ##执行结果如下:
    array([[ 75,   9,  72,  12, 666],
           [  1,  16,  64,  79,   5],
           [ 50,  25,   6,  71,  76],
           [ 28,  11,  84,  18,  20],
           [ 87,  68,  50,  14,  29]])
    
    # 将数组的行和列 都进行倒序排列
    arr[::-1, ::-1]
    
    
    ##执行结果如下:
    array([[87, 68, 50, 14, 29],
           [28, 11, 84, 18, 20],
           [50, 25,  6, 71, 76],
           [ 1, 16, 64, 79,  5],
           [75,  9, 72, 12, 37]])
    
    

    (3)变形

    将一维数组变形成多维数组

    import numpy as np
    arr_1 = np.arange(0, 100, 4) # 创建一个元素范围为0到100,元素步长为4的一维数组
    
    arr_1.reshape((-1, 5)) # 将一维数组变形成多维数组
    
    ##执行结果如下:
    array([[ 0,  4,  8, 12, 16],
           [20, 24, 28, 32, 36],
           [40, 44, 48, 52, 56],
           [60, 64, 68, 72, 76],
           [80, 84, 88, 92, 96]])
    
    

    将多维数组变形成一维数组

    import numpy as np
    np.random.seed(1) # 固定随机性
    arr_2 = np.random.randint(0, 100, size=(5, 5)) # 创建一个5行5列的随机数组
    
    arr_2 = arr_2.reshape((25,)) # 将多维数组变形成一维数组
    arr_2
    
    ##执行结果如下:
    array([37, 12, 72,  9, 75,  5, 79, 64, 16,  1, 76, 71,  6, 25, 50, 20, 18, 84, 11, 28, 29, 14, 50, 68, 87])

    (4)级联

    语法: np.concatenate((arr1, arr2), axis=1)

    参数:

    • arr1, arr2表示要级联的数组
    • axis=1表示横向级联, axis=0表示纵向级联
    import numpy as np
    np.random.seed(1) # 固定随机性
    arr = np.random.randint(0, 100, size=(5, 5)) # 创建一个5行5列的随机数组
    arr
    
    
    ##执行结果如下:
    array([[37, 12, 72,  9, 75],
           [ 5, 79, 64, 16,  1],
           [76, 71,  6, 25, 50],
           [20, 18, 84, 11, 28],
           [29, 14, 50, 68, 87]])
    np.concatenate((arr, arr), axis=1) # 将数组arr进行横向级联
    
    
    ##执行结果如下:
    array([[37, 12, 72,  9, 75, 37, 12, 72,  9, 75],
           [ 5, 79, 64, 16,  1,  5, 79, 64, 16,  1],
           [76, 71,  6, 25, 50, 76, 71,  6, 25, 50],
           [20, 18, 84, 11, 28, 20, 18, 84, 11, 28],
           [29, 14, 50, 68, 87, 29, 14, 50, 68, 87]])

     (5)切分

    与级联类似, 三个函数完成切分工作:

    • np.split(arr, 行/列号, 轴)
      • 注意: 参数2是一个列表类型
    • np.vsplit()
    • np.hsplit()

    (6)副本

    import numpy as np
    np.random.seed(1) # 固定随机性
    arr = np.random.randint(0, 100, size=(5, 5)) # 创建一个5行5列的随机数组
    arr
    
    
    ##执行结果如下:
    array([[37, 12, 72,  9, 75],
           [ 5, 79, 64, 16,  1],
           [76, 71,  6, 25, 50],
           [20, 18, 84, 11, 28],
           [29, 14, 50, 68, 87]])
    
    a = arr.copy() # 可以使用copy()函数创建副本,这样做不会对原数据造成影响
    a[2][2] = 666 # 修改副本的数据不会对原数据造成影响
    arr
    
    
    ##执行结果如下:
    array([[37, 12, 72,  9, 75],
           [ 5, 79, 64, 16,  1],
           [76, 71,  6, 25, 50],
           [20, 18, 84, 11, 28],
           [29, 14, 50, 68, 87]])
    a
    
    
    ##执行结果如下:
    array([[ 37,  12,  72,   9,  75],
           [  5,  79,  64,  16,   1],
           [ 76,  71, 666,  25,  50],
           [ 20,  18,  84,  11,  28],
           [ 29,  14,  50,  68,  87]])
    

    5.ndarray的聚合操作

    (1)求和np.sum()

    import numpy as np
    np.random.seed(1) # 固定随机性
    arr = np.random.randint(0, 100, size=(5, 5)) # 创建一个5行5列的随机数组
    arr
    
    
    ##执行结果如下:
    array([[37, 12, 72,  9, 75],
           [ 5, 79, 64, 16,  1],
           [76, 71,  6, 25, 50],
           [20, 18, 84, 11, 28],
           [29, 14, 50, 68, 87]])
    
    arr.sum(axis=1) # axis=1 对所有行求和
    
    
    ##执行结果如下:
    array([205, 186, 228, 161, 248])
    
    arr.sum(axis=0) # axis=0 对所有列求和
    
    
    ##执行结果如下:
    array([167, 215, 276, 129, 241])

    (2)最大最小值: np.max()np.min()

    arr.max(axis=1) # 求每一行的最大值
    
    arr.max(axis=0) # 求每一列的最大值
    
    arr.min(axis=1) # 求每一行的最小值
    
    arr.min(axis=0) # 求每一列的最小值

    (3)平均值: np.mean()

    arr.mean(axis=1) # 求每一行的平均值
    
    arr.mean(axis=0) # 求每一列的平均值

    (4)其他聚合操作

    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.argmin np.nanargmin Find index of minimum value
    np.argmax np.nanargmax Find index of 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
    np.power   幂运算

    6.ndarray的排序

    快速排序

    np.sort()ndarray.sort()都可以, 但有区别:

    • np.sort()不改变输入
    • ndarray.sort()本地处理, 不占用空间, 但改变输入
    np.sort(arr, axis=1) # 对每一行进行升序排序
    
    np.sort(arr, axis=0) # 对每一列进行升序排序
  • 相关阅读:
    Office 2007在安装过程中出错-解决办法
    Sql日期时间格式转换
    大型网站架构演变和知识体系
    作为一个web开发人员,哪些技术细节是在发布站点前你需要考虑到的
    Java 入门基础
    技术类面试、笔试题汇总
    怎样玩转千万级别的数据
    数据库性能优化:SQL索引
    最后一公里极速配送
    编辑-滴滴算法大赛算法解决过程
  • 原文地址:https://www.cnblogs.com/Wj-Li/p/10864891.html
Copyright © 2011-2022 走看看