• numpy基本使用


    轴 axis 正常情况 0 行, 1 列

    聚合函数  0列,  1 行

     

    import numpy as np

    np.__version__    #查看numpy版本

    一.创建ndarray

    1.使用np.array()由python list创建

    l = [1,4,2,5,6]

    n = np.array(l)

    注意:

    • numpy默认ndarray的所有元素的类型是相同的

    • 如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str>float>int

    2. 使用np的routines函数创建

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

    • 用来产生全是1的ndarray

    • shape是用来指定ndarray的形状

    • dtype是数字的类型

    例如: np.ones(shape=(7,7), dtype=np.int8)

     

    2) np.zeros(shape, dtype=float, order='C')

    • 用来产生全是0的ndarray

    例如: np.zeros(shape=(7,7), dtype=np.float32)

     

    3) np.full(shape, fill_value, dtype=None, order='C')

    • 按照指定数字产生ndarray

    例如: np.full(shape=(8,8), fill_value=8.)

     

    4) np.eye(N, M=None, k=0, dtype=float)

    • 生成对角线全是1,其他位置全是0的2维ndarray

    • N 代表行, M代表列, M不写默认行列一样, 都为N

    • k=0 表示主对角线的索引.

    • 这种主对角线全是1, 其他位置全是0的矩阵,叫做单位矩阵.

    • 任何矩阵乘于他的单位矩阵,等于他本身.

    • 如果一个矩阵可以通过矩阵的行列式变化为单位矩阵,那么说明这个矩阵有唯一的解.

    例如: np.eye(8, k=0)

     

    5) np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

    • 将一个范围分隔成num份

    • start,stop,范围起始值

    • num 代表分成多少份

    • endpoint 返回时是否包含stop的值

    • retstep是否返回步长. 为True时返回为元组形式 (ndarray, step)

    例如: np.linspace(0, 100, num=30, endpoint=False, retstep=True)

     

    6) np.arange([start, ]stop, [step, ]dtype=None)

    • 就把np.arange当成numpy版本的range

    • 使用np.arange的时候,尽量用整形参数.

     

    7) np.random.randint(low, high=None, size=None, dtype='l')

    • 生成一个元素随机ndarray

    • size=(3,4,5) 指定ndarray形状

    例如: np.random.randint(0, 100, size=(3,4,5))

    • 伪随机数

      np.random.seed(1)

      #np.random.RandomState(1)

      np.random.randint(0, 100, size=(3,4,5)) # 设置了种子元素会固定不变

     

    8) np.random.randn(d0, d1, ..., dn)

    • 标准正态分布

     

    9) np.random.normal(loc=0.0, scale=1.0, size=None)

    • 正态分布 也叫高斯分布

    • 概率密度曲线

    • loc = location 平均值, 表示正态分布落在哪个位置,也就是中间轴线的位置

    • scale 标准差,正态分布的数值范围

    例如: n = np.random.normal(loc=10, scale=3, size=(10000, 2))

    n.mean() 求平均值 9.99526303211945 都只是无限接近

    n.std() 求标准差 3.018610240584875

     

    10) np.random.random(size=None)

    • 生成元素为0到1的随机数的ndarray

    例如: np.random.random(size=(1000, 200, 50))

    11)np.random.rand(100, 20, 3)

    和np.random.random一样, 参数不需要是元组

     

    二.ndarray的属性

    4个必记参数: ndim:维度 shape:形状(各维度的长度) size:总长度 dtype:元素类型

    n = np.random.randint(0, 100, size=(3,4,5))
    n.ndim     3
    n.shape     (3,4,5)
    n.size     60   <--- 3*4*5
    n.dtype     dtype('int32')

     

    三. ndarray的基本操作

    1.索引

    一维与列表完全一致 多维时同理

    2.切片

    一维与列表完全一致 多维时同理

    将数据反转,例如[1,2,3]---->[3,2,1]

    两个::-1进行切片

    3.变形

    使用reshape函数

    n.reshape(6,10)

    n.reshape(10,6)

    或 np.reshape(n, (10,6))

    reshape之后的size不能发生变化

    4.级联

    np.concatenate() 级联需要注意的点:

    • 级联的参数是元组

    • 维度必须相同

    • 形状相符

    • 【重点】级联的方向默认是shape这个tuple的第一个值所代表的维度方向

    • 可通过axis参数改变级联的方向

    np.concatenate((n1,n2), axis=0)

    • axis=1 , 增加列数, 在水平方向上级联

    • axis=0 , 增加了行数, 垂直方向级联

    • 级联的时候,水平级联要求行数一致.

    • 垂直级联,要求列数一致.

    np.hstack()与np.vstack() 水平级联与垂直级联,处理自己,进行维度的变更

    np.hstack((n1, n2)) 水平级联

    np.vstack((n1,n2)) 垂直级联

     

    5.切分

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

    • np.split

    • np.vsplit

    • np.hsplit

    np.split(n2, [2, 5]) 切分为三个ndarray 垂直方向上切分

    np.split(n2, [1, 3], axis=1) 水平方向上切分

    np.hsplit(n2, [2, 5]) 水平方向上切分

    np.vsplit(n2, [1, 3]) 垂直方向上切分

     

    6.副本

    重要: 所有赋值运算不会为ndarray的任何元素创建副本。对赋值后的对象的操作也对原来的对象生效。 相当于python赋值拷贝

    可使用copy()函数创建副本 相当于python深拷贝

    n = n2.copy()

     

    四.ndarray的聚合操作

    求和 np.sum

    n.sum()

    n.sum(axis=0) # 聚合运算axis=0 表示是对列操作

    n.sum(axis=1) # 聚合运算axis=1,表示对行操作.

    最大最小值:np.max/ np.min n.max()/n.min

    同理

    np.max(n, axis=1)

    求最大或最小值的下标

    n.argmax()

    n.argmin()

    其他聚合操作

    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 幂运算

    操作文件

    使用pandas打开文件president_heights.csv 获取文件中的数据

    heights = pd.read_csv('./president_heights.csv')

    data = heights['height(cm)'].values.copy()

    data.mean() 平均升高

    data.min() 最高身高

     

    五, ndarray的矩阵操作

    矩阵的基本操作

    算术运算符

    加减乘除

    • ndarray和普通单个数字运算,是各个元素分别运算.

    • 矩阵和矩阵运算,要求行列要完全相同.

    矩阵积np.dot()

    n1 = np.random.randint(0,10, size=(3,4)) n2 = np.random.randint(0,10, size=(4, 6)) np.dot(n1, n2)

    矩阵相乘是由n1的行分别取乘n2的列, 所以 n1的列数要=n2的行数

    矩阵的乘法,没有交换律 A.B != B.A

     

    广播机制

    两矩阵相加要求行列都要一样

    【重要】ndarray广播机制的两条规则

    • 规则一:为缺失的维度补1 (加[])

    • 规则二:假定缺失元素用已有值填充

    a = np.arange(3).reshape(3,1)

    b = np.arange(3)

    a+b 结果:

    array([[0, 1, 2],
          [1, 2, 3],
          [2, 3, 4]])

     

    六.ndarray的排序

    使用numpy实现选择排序

    def select(arr):
      for i in range(len(arr) -1):
          # 从剩下的ndarray中选出最小值的索引.
          index = np.argmin(arr[i:]) + i
          if arr[i] > arr[index]:
              # 交换位置
              arr[i], arr[index] = arr[index], arr[i]
      return arr

    1. 快速排序

    排序只对1维的数据有意义

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

    • np.sort() 返回排序后的新数组 , 不改变原数组, 会开辟新的内存空间

    • ndarray.sort() 在原数组上操作,不占用空间

     

    2.部分排序

    n = np.arange(0,100) np.random.shuffle(n) # 将数组的值打乱顺序

    np.partition(n, kth=-5) # 找出前五个最大的数

    np.partition(n, kth=5) # 找出最小的五个数

     

  • 相关阅读:
    JXOI2018简要题解
    TJOI2018简要题解
    BJOI2018简要题解
    【题解】Luogu P4091 [HEOI2016/TJOI2016]求和
    【题解】Luogu P5301 [GXOI/GZOI2019]宝牌一大堆
    【题解】Luogu P5291 [十二省联考2019]希望
    【题解】Luogu P3349 [ZJOI2016]小星星
    【题解】Luogu P5327 [ZJOI2019]语言
    【题解】Luogu P5319 [BJOI2019]奥术神杖
    【题解】Luogu P5471 [NOI2019]弹跳
  • 原文地址:https://www.cnblogs.com/Deaseyy/p/11921616.html
Copyright © 2020-2023  润新知