zoukankan      html  css  js  c++  java
  • numpy

    2021-09-13  22:06:11
    '''
    注意 注意 注意
    行 列要分清
    行 是每行的第一个元素 所谓常用的1列
    列 是每列的第一个元素 所谓常用的1行

    '''

    列表推到式


       a = [num for num in range(10)]
       print(a)

      import numpy as np

    创建数组的3种方法
       a = np.arange(1,5,dtype='float','int','int32','int64')
       这个方法 生成列表数组
       np.arange(开始,结束,步长) 只写一个数 是从0开始 到那结束
       print(a) 推荐这个方法 修改数据类型
      a = np.array(range(1,5))
       a = np.array([1,2,3,4,5])
       a.dtype 查看数据类型
      
      
      '''a.shape  返回 数组是 几行几列
      a.ndim    返回 数组是 维度
      a.size 返回 所有数据元素的数目
      a.dtype 查看数组类型
      a.ones(数或元组) 创建一个为1的3个 [1 1 1]
    如果是(2,3) 则显示为两行三列的数组
    [[1,1,1] (行,列)
    [1,1,1]]
      a.zeros 同上

      a.full(个数或个数元组,数或数组) (行,列) 其他的同上
      a.argsort()[-3:] 取下标的方法 并默认升序排列
      np.ones_like(a) 把数组里所有的数 都改成 1
      np.full_like(a) 把数组里所有的数 都改成 0
      np.zeros(a) 把数组里所有的数 都改成 自定义数 '''

       np.random.randn() 一个随机数 单个
       np.random.randn(3) 3个随机数 一维
       np.random.randn(3,2) 二维数组的随机数 二维
       np.random.randn(2,3,2) 两个二维数组的随机数 三维

      a = np.arange(10).reshape(2,5) 2:行 4:列
       a = np.arange(10) 第二种写法
       a.reshape(2,5)
       print(a)
      '''
      [[0 1 2 3 4]
      [5 6 7 8 9]]
      shape 返回数组的维度
      reshape 不改变数组的值 修改形状
      '''


       a + 1 是数组里的每一个元素都 + 1
       两个相同维度数组做运算 是每个数组里的对应的元素运算
       两个不同维度数组做运算 二维数组 + 两个相同的一维数组 运算结果
       广播规则
       可以运算 列相同久可以运算
       形状相同 可以运算
       形状不同 前后缘维度相同 可以运算
       4,2 2就是后缘 4是前缘
       5,2
       不能运算
       超出后援维度 不可以运算
       超出前援维度 不可以运算


       A[0,0] 0行 0列
       A[-1,2] 最后一行 2列
       A[2] 2列的所有内容
       A[-1] 最后一行
       A[0:-1] 取出了最后一行之外的其他所有行 顾头不顾尾
       A[0:2,2:4] 取0和1行 ,2和3列
       A[:,2] 取所有行中的第二列
       print(a[:,0:-1])
      '''
      两行 5个元素 上面的取值 只取到前4个
      [[0 1 2 3]
       [5 6 7 8]]
      '''

       布尔索引和条件索引
       a 是0-9的数组
       select = a > 5
       print(select) 这里返回的布尔值 [[False False False False False]
       print(a[select]) 直接把筛选条件放到[]里 就会拿到真值 [6 7 8 9]
       a[a <= 5] = 0
       a[a > 5] = 1
       print(a) [[0 0 0 0 0],[0 1 1 1 1]]
       把数组满足条件的赋值
       外层的a[]是筛选 内层a>5 作为外层数组的切片条件
       返回的都是一维数组
       print(a[a <= 5]) [0 1 2 3 4 5] 每个元素 按条件拿取
       二维数组 所有行 第三列 大于5的 加上520
       a = np.arange(1,21).reshape(4,5)
       select = a[:,3] > 5 确立筛选条件 所有行 第3列大于5
      
       a[select] += 520 运算
       print(a)
       '''[[ 1 2 3 4 5]
       [526 527 528 529 530]
       [531 532 533 534 535]
       [536 537 538 539 540]]
       [ 4 529 534 539]'''
      
       print(a[:,3])
       在切片取一次是可以取到的
       [ 4 529 534 539] 只是取到第3列 不可以全部取到

       正确方法
       a[:,3][select] += 520
       这才是正确需要的
       2个筛选条件 第一个先帅选出操作目标 在筛选条件
      '''[[ 1 2 3 4 5]
    [ 6 7 8 529 10]
    [ 11 12 13 534 15]
    [ 16 17 18 539 20]]'''

       与或 不能用 or and 可以用 & |
       a = np.arange(10)
       select = (a%2==0) | (a<8)
       print(a[select])
      '''
      [0 2 4 6] &
      [0 1 2 3 4 5 6 7 8] |
      '''


       print(a[[2,3,5]])
      '''
      [2 3 5]
      '''
       数组[[行,行,行,行],[列,列,列,列]]
       拿数据 是0行0列 1行1列 2行2列 3行3列 数字对应上面列表的下标
       数组[[:],[列,列]]
       拿数据 是所有行 列:列

       取最大的3个数
      a = np.random.randint(1,100,10)
      print(a)
      print('-'*30)
      b = a.argsort()[-3:] 取下标的方法 并默认升序排列
      print(b)
      print(a[b])
      '''
        [94 21 91 31 85 84 4 92 13 82] 列表随机数
      ------------------------------
      [2 7 0] 记录下表位置 默认升序 取到最后3个[-3:]
      [91 92 94] 找出最大的3个数字
      一维数组是 0轴
      二维数组是 行是0轴 列是1轴
      三维数组是 行是0轴 列是1轴 纵深是2轴'''

    数组转置
      以下两个方式 都是 数组.方法()
      a.transpose() 数组转置
      a.swapaxes(1,0) 轴转置 行转列 列转行
      原始是0和1 转换成1,0
      以上两个方法 效果一样

    random
       import random
      random.seed(100)
     有这个方法在 只会产生一组随机数 怎么运行都会是 这组随机数
     取消这个方法每次产生的随机就会变化
      print(random.random())
      print(random.random())
       print(random.random())

      a = np.random.rand(1,2,3) 行 列 纵深
      print(a)

      randint 随机正数
      np.random.randint(1,10,size=[5]) size 是维度 可以是多维

      np.random.random(size=(2,3)) 也是维度 但是是小数

    choice
      np.random.choice(5,3) 0-5的随机数 需要3个数
      np.random.choice(5,(2,2)) 0-5的随机数 需要2行2列的
      np.random.choice([1,2,4,6,7,53,46],3) 从前面的数组里 随机拿出3个元素
      np.random.choice([1,2,4,6,7,53,46],[2,2]) 从前面的数组里 随机拿出2行2列的
      print(np.random.choice([1,2,4,6,7,53,46],[2,2]))
      '''[[ 7 46]
      [ 7 1]]'''

    shuffle 随机排列
       a = np.arange(10)
      print(a)
      np.random.shuffle(a)
      print(a)
      '''
      [0 1 2 3 4 5 6 7 8 9]
      [1 3 2 6 8 0 4 7 5 9]
      '''
      按最大维度排列
      np.random.shuffle(一维数组) 数据排列
      np.random.shuffle(二维数组) 行排列 原数据做修改 从新赋值操作 None
      np.random.shuffle(三维数组) 块排列

      直接排列一维数组
      a = np.random.permutation(10) 这里的10 就是range(10)
      order_by_num = np.random.permutation(二维数组) 行排序 不改变原数组 需要重新赋值

      实例
      num = np.arange(9).reshape(3,3)
      print(num)
       np.random.shuffle(num)
      print(num) 这是在原数组做修改
      '''
      [[0 1 2]
       [3 4 5]
      [6 7 8]]
      [[3 4 5]
       [6 7 8]
       [0 1 2]]
      '''
      a = np.random.permutation(num)
      print(a)


    统计方法
       np.sum(a) 每个元素相加 二维一样
       np.prod(a) 每个元素相乘 二维一样
       np.cumsum(a) 从0 开始累加 并以数组的方式显示出来 二维把结果变成一维数组
       np.cumprod(a) 从1 开始累加 乘法不能乘0 并以数组的方式显示出来 二维把结果变成一维数组
       np.max(a) 最大值 二维一样
       np.min(a) 最小值 二维一样
       np.argmax(a) 最大值所在的下标 二维按行 并换行继续计数
       np.argmin(a) 最小值所在的下标 二维按行 并换行继续计数
       np.mean(a) 平均数 二维一样
       np.median(a) 中位数
       np.average(a) 加权平均
       np.bincount(a) 统计非负正数的个数 不能统计浮点数
       np.argmax(a) 返回众数 不能用二维数组
       众数不建议在np里做 用pandas做 方便
       np.sum(a,axis=0)
       axis 轴 0行 1列
     将条件逻辑作为数组操作
    np.where(a>3,520,1314) 如果a>3 真返回520 假返回1314
    大于3 有几个 求个数
    (a>3).sum true=1 false=0 把所有真的数据加在一起

    any all
    a.any() 有真就返回真
    a.all() 只有全为真才返回真

    按值大小进行排序
    a.sort() 把原始数组进行排序
    np.sort(a) 二维数组 是按列排序 默认是按后缘排序

    从小到大的索引 下标排序
    x = np.arange(9)
    a = np.argsort(x) 下标索引排序 数据按升序排 返回下标的位置 升序
    a = np.argsort(-x) 下标索引排序 数据按升序排 返回下标的位置 降序
    a下标 x是数组
    x[a] 找的是 数组下标排序 要返回排序结果 需要套用下标使用 升序
    降序同上 argsort(-x)

    二维数组的排列 在pandas里有更好的方案

    一致与其他合集
    np.unique(a) 唯一值 去重
    np.in1d(a,b) 检查一个数组是否在另一个数组中 返回布尔值
    b数组 是否在 a数组中出现 返回true或false
    '''
    a = [2,6,9,67,5,3]
    b = [6,5,3]
    print(np.in1d(a,b))
    [False True False False True True]
    上面是a数组返回的值 '''

    深浅拷贝
    浅拷贝
    a = b 不能这样赋值 因为a和b互相影响 在内存里a变成b也会发生变化
    a = b[:] 会创建新的对象a 但是a的数据完全由b保管 这里的a指向了b的内存地址
    深拷贝 推荐深拷贝 互相不影响
    a = b.copy() 复制 a和b互不影响 相当于重新开辟了一个空间保存a的值





  • 相关阅读:
    20200721训练记录
    20200717训练记录
    打家劫舍III(力扣第337题)
    HBase API的删除数据操作的分析
    相交链表(第160题)
    删除排序链表中的重复元素(第83题)
    合并两个有序链表(力扣第21题)
    删除链表的倒数第N个节点(第19题)
    HBase的架构原理
    回文链表、链表求和(234、445)
  • 原文地址:https://www.cnblogs.com/xuexihainan/p/15249526.html
Copyright © 2011-2022 走看看