• 18-09-21 numpy 的基础学习01


    # 1关于numpy 的学习

    import numpy as np

    # 一 如何创建数组****

    # 1 有规律的一维数据的创建======
    # 1 range() 和arange() 区别 貌似没有区别
    lst1 = range(10)
    lst1 = list(lst1)
    # print(lst1,type(lst1)) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>

    lst2 = np.arange(10)
    lst2 = list(lst2)
    # print(lst2,type(lst2)) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>

    # 2 利用array()函数创建无规律的一维数组 array 一维数组的创建(元素由元祖 或者列表) ======
    arr1 = np.array((1,20,13,28,22))
    arr2 = np.array([1,20,13,28,22])
    # print("arr1",arr1,type(arr1)) #arr1 [ 1 20 13 28 22] <class 'numpy.ndarray'> ndarray:多维数组
    # print("arr2",arr2,type(arr2)) #arr1 [ 1 20 13 28 22] <class 'numpy.ndarray'> ndarray:多维数组

    # 3 二维数据的创建========
    # array 二维数组的创建(元素由元祖套元祖 或者列表套列表) #大列表套小列表

    arr4 = np.array(((1,2,3),(4,5,6),(7,8,9)))
    # print("arr4=",arr4,type(arr4))
    # arr4= [[1 2 3]
    # [4 5 6]
    # [7 8 9]] <class 'numpy.ndarray'>

    arr5 = np.array([[1,2,3],[4,5,6],[7,8,9]])
    # print("arr5=",arr5,type(arr5))

    # arr5= [[1 2 3]
    # [4 5 6]
    # [7 8 9]] <class 'numpy.ndarray'>

    # 4 特殊数组的创建

    # 4-1 zeros 方式 不能嵌套
    arr6 = np.zeros(5) #返回一维元素全为0的数组
    # for i in arr6:
    # print(i)
    # print("arr6",arr6,type(arr6)) #arr6 [0. 0. 0. 0. 0.] <class 'numpy.ndarray'>

    arr7 = np.zeros((2,5)) #返回一维元素全为0 的2x5 的二维数组
    # for i in arr7:
    # print(i)
    # print("arr7",arr7,type(arr7))
    # arr7 [[0. 0. 0. 0. 0.]
    # [0. 0. 0. 0. 0.]] <class 'numpy.ndarray'>

    arr8 = np.zeros([3,6]) #返回元素全为0 的 3x6的数据
    # print("arr8",arr8,type(arr8)) #arr7 [[0. 0.]] <class 'numpy.ndarray'>

    # arr8 [[0. 0. 0. 0. 0. 0.]
    # [0. 0. 0. 0. 0. 0.]
    # [0. 0. 0. 0. 0. 0.]] <class 'numpy.ndarray'>


    # 4-2 empty 的方式 个人感觉和zeros 有点相似
    arr9 = np.empty(3) #返回一维空数组
    # print("arr9=",arr9,type(arr9)) #arr9= [0. 0. 0.] <class 'numpy.ndarray'>

    arr10 = np.empty([3,4]) # 返回3x4的二维空数组
    # print("arr10",arr10,type(arr10))
    # arr10 [[0. 0. 0. 0.]
    # [0. 0. 0. 0.]
    # [0. 0. 0. 0.]] <class 'numpy.ndarray'>


    # 二 有关数据的属性和函数****

    # 1 shape 方法返回数组的行数 和列数
    arr11 = np.array([[1,2,3],[4,5,6],[7,8,9]])
    arr11 = arr11.shape #shape 方法返回数组的行数 和列数
    #print(arr11) #(3, 3) #3行3列

    # 2#dtype 方法返回数组的数据类型 int32
    arr12 = np.array([[1,2,3],[4,5,6],[7,8,9]])
    # arr12 = arr12.dtype #dtype 方法返回数组的数据类型 int32
    #print(arr12)

    # 3-1通过ravel的方法将数组拉直(多维数据降为一维数据)
    arr13 = np.array([[1,2,3],[4,5,6],[7,8,9]])
    arr13 = arr13.ravel()# 通过ravel的方法将数组拉直(多维数据降为一维数据)
    # print(arr13) #[1 2 3 4 5 6 7 8 9]
    # print(list(arr13)) #[1, 2, 3, 4, 5, 6, 7, 8, 9]

    # 3-2通过flatten 的方法将数组拉直
    arr14 = np.array([[1,2,3],[4,5,6],[7,8,9]])
    arr14 = arr14.flatten()#通过flatten 的方法将数组拉直
    # print(arr14) #[1 2 3 4 5 6 7 8 9]

    # 注意:虽然ravel() 和flatten() 都是将数组拉直,
    # 区别:1 racelI() 的方法生成的是原数组的视图,无需找有内存空间,但是数组的变化会影响到原数组的变化
    # 2 flatten() 的方法返回的是真实的值 其值得改变并不会影响到原数组的变化

    # 3-3 举例说明区别拉直是否改变原生数组 flatten不变 ravel 变化
    arr15 = np.array([[1,2,3],[4,5,6],[7,8,9]])
    _arr15 = arr15.flatten() #原数组不变
    _arr15[:3] = 0
    # print(arr15)
    # [[1 2 3]
    # [4 5 6]
    # [7 8 9]]

    arr16 = np.array([[1,2,3],[4,5,6],[7,8,9]])
    _arr16 = arr16.ravel()# 原数组会随之变化
    _arr16[0:3] = 0
    # print(arr16)
    # [[0 0 0]
    # [4 5 6]
    # [7 8 9]]

    #4返回数组的维数ndim 自己的理解就是嵌套几层
    arr17 = np.array([[1,2,3],[4,5,6],[7,8,9]])
    arr17 = arr17.ndim
    # print(arr17) #2

    # 5 返回数组元素的个数 size
    arr18 = np.array([[1,2,3],[4,5,6],[7,8,9]])
    arr18 = arr18.size
    # print(arr18) #9

    # 6 返回数组的转置结果 类似zip类型(将原始的列,变成每行 )
    arr19 = np.array([[1,2,3],[4,5,6],[7,8,9]])
    arr19 = arr19.zip
    # print(arr19)
    # [[1 4 7]
    # [2 5 8]
    # [3 6 9]]

    # 了解复数 z=a+bi(a,b均为实数)的数称为复数,其中a称为实部,b称为虚部,i称为虚数单位
    # 7 如果数组的数据类型为复数的话,real方法可以返回复数的实部,imag 方法返回复数的虚部
    # 返回数组有多少行,

    # 8 长度参数 len()
    arr20 = np.array([[1,2,3],[4,5,6],[7,8,9]])
    l = len(arr20)
    # print(l) #3

    # 8 hstack()或者column_stack() 在列数一定情况下 横向拼接 在每一行后边就追加
    arr21 = np.array([[1,2,3],[4,5,6],[7,8,9]])
    arr22 = np.array([[10,20],[40,50],[70,80]])
    # arr23 = np.hstack((arr21,arr22))
    arr23 = np.column_stack((arr21,arr22)) #一样的效果
    # print(arr23)

    # [[ 1 2 3 10 20]
    # [ 4 5 6 40 50]
    # [ 7 8 9 70 80]]


    # 9 vstack()或者row_stack() 在行数一定的情况下 纵向拼接
    arr24 = np.array([[1,2,3],[4,5,6],[7,8,9]])
    arr25 = np.array([[10,20,30],[40,50,60]])
    arr26 = np.vstack((arr24,arr25))
    # arr26 = np.row_stack((arr24,arr25))#拼接列 一样的效果
    # print(arr26)

    # [[ 1 2 3]
    # [ 4 5 6]
    # [ 7 8 9]
    # [10 20 30]
    # [40 50 60]]


    # 10 reshape() 函数 将一维数组设置为二维数组,且3行6列
    # resize() 函数可以重新设置数组的行数 和列数

    arr27 = np.array(np.arange(18))
    # print(arr27) #[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17]
    arr27 = arr27.reshape(3,6)
    # print(arr27)
    # [[ 0 1 2 3 4 5]
    # [ 6 7 8 9 10 11]
    # [12 13 14 15 16 17]]
    # ???????? resize() 略 会直接改变元祖的形状


    # 11 tolist 将数组转换成列表,astype() 强制转换成数组的数据类型,

    arr28 = np.array([[1,2,3],[4,5,6],[7,8,9]])
    _arr28 = arr28.tolist()
    # print(arr28,_arr28)
    # [[1 2 3]
    # [4 5 6]
    # [7 8 9]]
    # [[1, 2, 3], [4, 5, 6], [7, 8, 9]]


    arr29 = arr28.astype(float)
    # print(_arr28,"==",arr29,type(arr29))
    # [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    # ==
    # [[1. 2. 3.]
    # [4. 5. 6.]
    # [7. 8. 9.]] <class 'numpy.ndarray'>

    # 12 数组元素的获取==很重要

    ## 12-1 一维数组元素的获取与列表 通过切片取值 ,元祖的获取方式一样 ,通过索引和切片的方式获取数组元素,
    arr30 = np.array(np.arange(10))
    #print(arr30)


    # print("取值第6个元素",arr30[5])# 5
    # print("取值前3个元素",arr30[:3])# [0 1 2]
    # print("取值第4个元素及之后的元素",arr30[4:]) #[4 5 6 7 8 9]
    # print("取值最后的2元素",arr30[8:9]) #[8]
    # print("取值从1开始步长为3的元素",arr30[::3]) #[0 3 6 9]

    # 12-2 二维数组元素的获取
    arr31 = np.array(np.arange(12).reshape(3,4)) #三行四列
    # print(arr31)
    # [[ 0 1 2 3]
    # [ 4 5 6 7]
    # [ 8 9 10 11]]

    # print("返回数组的第2行",arr31[1]) #返回数组的第2行 [4 5 6 7]
    # print("返回数组的前2行",arr31[:2]) #返回数组的前2行 [[0 1 2 3][4 5 6 7]]
    # print("返回数组的第1行和第3行",arr31[::2])
    # print("返回数组的第1行和第3行",arr31[[0,2]])#注意里面套装两个[] 截取的是0 第一 和2 第3 行数据
    # 返回数组的第1行和第3行 [[ 0 1 2 3]
    # [ 8 9 10 11]]


    # ==========关于列的返回值 不理解??????
    # print("返回数组的第1列",arr31[:,0]) #返回数组的第1列 [0 4 8] #0 代表第一列
    # print("返回数组的后2列",arr31[:,-2:]) # -2代表后2列=====????
    # 返回数组的后2列
    # [[ 2 3]
    # [ 6 7]
    # [10 11]]
    # print("返回数组的第1列和第3列",arr31[:,[0,2]])
    # 返回数组的第1列和第3列
    # [[ 0 2]
    # [ 4 6]
    # [ 8 10]]

    # print(arr31[1,2]) #返回的是第二行第三列的数据
    # 6

    # 12-3 布尔索引 即索引值为 True 和 Fales 需要注意的是布尔索引必须输数组对象。

    # 1选出所有的True 对象
    log = np.array([False,False,False,True,True,True])#此处相当于6行,必须和数组对应好行数
    arr32 = np.array(np.arange(12).reshape(6,2)) #对比以上的6行,前三行是False 后三行是True 显示后三行
    # print(arr32)
    # print(arr32[log])
    # [[ 6 7]
    # [ 8 9]
    # [10 11]]

    # 2 选出所有的False 对象

    # print(arr32[-log]) #?????? 出错了 不知道为什么出错?????????


    # 场景示例 查询相关的行(以下注解:一共7行,过滤是A的数据)

    area = np.array(["A","B","A","C","A","B","D"])
    # print(area) #['A' 'B' 'A' 'C' 'A' 'B' 'D']

    arr33 = np.array(np.arange(21).reshape(7,3))
    # print(arr33)

    # [[ 0 1 2]
    # [ 3 4 5]
    # [ 6 7 8]
    # [ 9 10 11]
    # [12 13 14]
    # [15 16 17]
    # [18 19 20]]

    # print(arr33[area == "A"]) #一维数组 每个元素看成一行,元素A 的1 3 5 行
    # [[ 0 1 2]
    # [ 6 7 8]
    # [12 13 14]]

    # print(arr33[(area == "A") | (area == "C")]) #注意大小写 该是什么就是什么

    # [[ 0 1 2]
    # [ 6 7 8]
    # [ 9 10 11]
    # [12 13 14]]

    # 布尔索引也可以与普通索引或切片混合使用
    # 截取 A行 的第1列和第3 列

    # print(arr33[area == 'A'][:,[0,2]]) #第1列和第3列

    # [[ 0 2]
    # [ 6 8]
    # [12 14]]
    # 花式索引 按照指定顺序返回对应的行

    # print(arr33[[3,0,5]]) # 注意里面是个数组的形式 按照索引取值每行

    # [[ 9 10 11]
    # [ 0 1 2]
    # [15 16 17]

    # 花式索引 按照指定顺序返回对应的行过滤出的列

    # print(arr33[[3,0,5]][:,[0,2]]) #按照以上得出的结果 再取列 第1列和第3列

    # [[ 9 11]
    # [ 0 2]
    # [15 17]]

    # 如果想使用比较简单的方式返回指定行以列的二维数组的话,可以使用ix_() 函数

    a = arr33[np.ix_([3,0,5],[0,2])] #和以上 [[3,0,5]][:,[0,2]]) 一样的
    # print(a)
    # [[ 9 11]
    # [ 0 2]
    # [15 17]]


    # 12-4 统计函数与线性代数运算
    # 统计运算中常见的聚合函数有:最小值、最大值、中位数、均值、方差、标准差等。首先来看看数组元素级别的计算:
    ####=== 1 取值范围 数字——np
    arr34 = 5-np.arange(1,13).reshape(4,3) #一共12个数字 从+4开始到-7 [-7:5]
    # print(arr34)
    # [[ 4 3 2]
    # [ 1 0 -1]
    # [-2 -3 -4]
    # [-5 -6 -7]]

    #### ===2 随机数 整数 random
    arr35 = np.random.randint(1,10,size = 12).reshape(4,3)
    # print(arr35)
    # [[6 5 8]
    # [8 6 1]
    # [2 5 8]
    # [6 7 3]]

    #### ===3 计算每个元素的平方 **2

    a = arr34 ** 2
    # print(a)

    # [[16 9 4]
    # [ 1 0 1]
    # [ 4 9 16]
    # [25 36 49]]

    #### ===4 计算每个元素的平方根 sqrt()
    arr36 = np.arange(4,7).reshape(1,3)
    # print(arr36)
    # [[4 5 6]]
    a = np.sqrt(arr36)
    # print(a)
    # [[2. 2.23606798 2.44948974]]
    # 由于负值的平方根没有意义,故返回nan。

    #### ===5 计算每个元素的自然对数值 log()

    # print(np.log(arr36))
    # [[1.38629436 1.60943791 1.79175947]]

    #### ===6 计算每个元素的绝对值 abs()

    arr37 = 5-np.arange(1,13).reshape(3,4)
    # print(arr37)
    # [[ 4 3 2 1]
    # [ 0 -1 -2 -3]
    # [-4 -5 -6 -7]]
    arr38 = np.abs(arr37)
    # print(arr38)

    # [[4 3 2 1]
    # [0 1 2 3]
    # [4 5 6 7]]
    # print(arr38.tolist()) #[[4, 3, 2, 1], [0, 1, 2, 3], [4, 5, 6, 7]]

    # 7 相同形状数组之间元素的操作========
    # 相同形状数组之间元素的操作 相加
    # print(arr37 + arr38)
    # [[8 6 4 2]
    # [0 0 0 0]
    # [0 0 0 0]]

    # 相同形状数组之间元素的操作 相减
    # print(arr37 - arr38)

    # [[ 0 0 0 0]
    # [ 0 -2 -4 -6]
    # [ -8 -10 -12 -14]]


    # 相同形状数组之间元素的操作 相乘
    # print(arr37 * arr38)

    # [[ 16 9 4 1]
    # [ 0 -1 -4 -9]
    # [-16 -25 -36 -49]]

    # 相同形状数组之间元素的操作 相除
    # print(arr38 / arr37)

    # [[ 1. 1. 1. 1.]
    # [nan -1. -1. -1.]
    # [-1. -1. -1. -1.]]


    # 相同形状数组之间元素的操作 整除
    # print(arr38 // arr37)

    # [[ 1 1 1 1]
    # print(arr38 // arr37)
    # [ 0 -1 -1 -1]
    # [-1 -1 -1 -1]]

    # 相同形状数组之间元素的操作 取余
    # print(arr37 % arr38)

    # [0 0 0 0]
    # print(arr37 % arr38)
    # [0 0 0 0]]



    # ===== 12-5 统计运算函数

    arr39 = 5-np.arange(1,13).reshape(3,4)
    # print(arr39)
    # [[ 4 3 2 1]
    # [ 0 -1 -2 -3]
    # [-4 -5 -6 -7]]

    # 1计算所有元素的和 sum
    # print(np.sum(arr39)) #-18

    #2 对每一列求和
    # print(np.sum(arr39,axis=0))
    # [ 0 -3 -6 -9]

    # 3 对每一行求和
    # print(np.sum(arr39,axis=1))
    # [ 10 -6 -22]

    #4 对每一个元素求累计和(从上到下,从左到右)
    # print(np.cumsum(arr39))
    # [ 4 7 9 10 10 9 7 4 0 -5 -11 -18]

    # 5 求每一列的累积和 返回个二维数组
    # print(np.cumsum(arr39,axis=0))
    # [[ 4 3 2 1]
    # [ 4 2 0 -2]
    # [ 0 -3 -6 -9]]

    # 6 求每一行的累计和 返回个二维数组
    # print(np.cumprod(arr39,axis=1))
    # [[ 4 12 24 24]
    # [ 0 0 0 0]
    # [ -4 20 -120 840]]

    # 7 计算所有元素的最小值
    # print(np.min(arr39)) #-7

    # 8 计算所有元素的最大值
    # print(np.max(arr39))

    # 9 计算每一列的最大值
    # print(np.max(arr39,axis=0)) #
    # [[ 4 3 2 1]

    # 10计算所有元素的平均值
    # print(np.mean(arr39)) #-1.5

    # 11 计算每一行的均值
    # print(np.mean(arr39,axis=1))
    # #[ 2.5 -1.5 -5.5]

    # 12 计算所有元素的中位数
    # print(np.median(arr39)) #-1.5

    # 13 计算每一列的中位数
    # print(np.median(arr39,axis=0))
    #[ 0. -1. -2. -3.]

    # 14 计算所有元素的方差
    # print(np.var(arr39))
    # 11.916666666666666

    # 15 计算每一行的标准差
    # print(np.std(arr39,axis=1))
    # [1.11803399 1.11803399 1.11803399]


    # numpy中的统计函数运算是非常灵活的,既可以计算所有元素的统计值,也可以计算指定行或列的统计指标。还有其他常用的函数,如符号函数sign,ceil( >= x的最小整数),floor( <= x的最大整数),modf(
    # 将浮点数的整数部分与小数部分分别存入两个独立的数组),cos,arccos,sin,arcsin,tan,arctan等。

    # 一个函数是where(),它类似于Excel中的if函数,可以进行灵活的变换:

    arr40 = 5-np.arange(1,13).reshape(3,4)
    # print(arr40)
    # [[ 4 3 2 1]
    # [ 0 -1 -2 -3]
    # [-4 -5 -6 -7]]

    arr41 = np.where(arr40<0,"negtive","positive") #negtive 否定的 positive 正数
    # print(arr41)
    # [['positive' 'positive' 'positive' 'positive']
    # ['positive' 'negtive' 'negtive' 'negtive']
    # ['negtive' 'negtive' 'negtive' 'negtive']]


    # 13-======其他函数

    # unique(x):计算x的唯一元素,并返回有序结果
    #
    # intersect(x,y):计算x和y的公共元素,即交集
    #
    # union1d(x,y):计算x和y的并集
    #
    # setdiff1d(x,y):计算x和y的差集,即元素在x中,不在y中
    #
    # setxor1d(x,y):计算集合的对称差,即存在于一个数组中,但不同时存在于两个数组中
    #
    # in1d(x,y):判断x的元素是否包含于y中

  • 相关阅读:
    Qt:绘制时,用线性渐变填充一个圆角矩形范围
    记录一个mysql数据迁移的坑
    idea中添加jar,maven有时候无法引入到jar
    img引入base64格式图片
    URL特殊符号转码_encodeURI/decodeURI
    [js] eval函数
    Modernizr
    判断对象上是否存在指定key
    Linux下格式化大于2T硬盘的方法
    win10 别人无法ping通本机设置
  • 原文地址:https://www.cnblogs.com/xiaoluoboer/p/9687654.html
Copyright © 2020-2023  润新知