# 列表推到式

  # 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
  # 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个数字
  '''

# npmpy 轴