NumPy基础(三)


目录:

    # 导入numpy模块并起别名为np
    import numpy as np
    
    # 显示当前numpy的版本号
    print(np.__version__)
    
    # 0.数组的概念
    '''
    数组是一个容器,它可以存放一定数量的元素,这些元素类型相同。
    '''
    
    # 1.创建一维数组
    arr1 = np.array([1, 2, 3, 4])
    
    print("创建数组:", arr1)
    
    # 2.创建二维数组
    '''
    二维数组就是以数组作为数组元素的数组,通俗点说就是数组里面全是数组的数组。
    '''
    arr2 = np.array([[1, 2, 3], [4, 5, 6]])
    print("二维数组:\n", arr2)
    
    # 3.数组的属性
    '''
    ndim      数组的维度(数组嵌套的层数) 
    shape     数组的形状(n,m) n行m列
    size      数组的数量
    dtype     数组元素的类型
    itemsize  数组每个元素的大小
    '''
    
    print("数组的维度:", arr2.ndim)
    print("数组的形状:", arr2.shape)
    print("数组的数量", arr2.size)
    print("数组元素的类型", arr2.dtype)
    print("数组每个元素的大小", arr2.itemsize)
    
    # 4.其他方式创建数组
    '''
    np.arange(start,end,step,dtype) 创建范围内的数组
    start 起始值
    end   结束值
    step  步长值
    dtype 数据类型
    '''
    arr3 = np.arange(-3, 3, 0.5)
    
    print("np.arange(-3, 3, 0.5):", arr3)
    
    '''
    等差数列函数
    linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None,
                 axis=0):
    num 生成的数据量,默认50
    endpoint 值为True是包含stop值,否则不包含,默认为True
    retstep  值为True时显示数据间距
    dtype    ndarry数组的类型
    '''
    print("等差数列:\n", np.linspace(0, 2 * np.pi, num=10, retstep=True))
    
    '''
    等比数列
    np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None,
                 axis=0):
    start (base ** start)
    end   (base ** end)             
    base:对数log的底数
    '''
    print("等比数列:", np.logspace(1.0, 4.0, num=50, base=2))
    
    '''
    创建指定形状的未初始化数组
    np.empty(shape, dtype=None)
    '''
    
    print("empty:", np.empty((3, 3, 2)))
    
    '''
    创建指定形状的全0数组
    np.zeros(shape, dtype=None)
    '''
    print('zeros:', np.zeros((3, 3)))
    
    '''
    创建指定形状的全1数组
    np.ones(shape, dtype=None)
    '''
    
    print('ones', np.ones((2, 3)))
    
    '''
    单位矩阵,即对角线元素为1,其余为0
    np.eye(N, M=None, k=0, dtype=float)
    '''
    print('eye创建单位矩阵:\n', np.eye(3))
    
    '''
    将以为数组转换为方阵(对角线为原一维数组,其余为0)
    diag(v, k=0)
    '''
    print(np.diag(np.arange(1, 10)))
    
    # 5.打印数组
    '''
    一维数组显示为列表
    二维数组显示为矩阵
    三维刷组显示为矩阵的列表
    '''
    a = np.arange(10)
    print("a:", a)
    
    # reshape() 转换维度
    b = np.arange(12).reshape(3, 4)
    print("b:\n", b)
    
    c = np.arange(24).reshape(2, 3, 4)
    print("c:\n", c)
    
    # 6.数组的常用数据类型
    '''
    int8     uint8
    int16    uint16
    int32    uint32
    int64    uint64
    float16
    float32
    float64
    float128
    bool
    
    object 
    string
    unicode
    '''
    
    arr4 = np.arange(1, 20, dtype=np.float32)
    print(arr4, arr4.dtype)
    
    # 类型转换
    print(np.float32(10))
    print(np.int8(2.12))
    
    # 7.随机数
    '''
    np.random.random   随机小数
    np.random.randint  随机范围内的整数
    np.random.rand     均匀分布 指定形状
    np.random.randn    正态分布(均值分布最多,两侧分布递减) 指定形状
    '''
    
    print(np.random.rand(2, 3))
    print(np.random.randn(2, 3))
    
    # 8.切片
    '''
    和列表索引相同
    '''
    arr5 = np.arange(1, 10)
    
    print(arr5[1:8:2])
    
    # 9.多维数组索引
    '''
    多维索引的每个数组维度都有一个索引,每个维度的索引之间使用逗号分隔
    '''
    arr6 = np.arange(16).reshape(4, 4)
    
    print(arr6)
    print(arr6[0, 0])
    print(arr6[2, :2])
    # 高级索引
    print(arr6[(1, 2, 3), (0, 1, 2)])
    print(arr6[arr6 > 10])
    
    import numpy as np
    
    # 1.修改数组的形状
    '''
    reshape 不改变数组的条件下改变形状
    flat    数组元素迭代器
    flatten 返回一个数组拷贝,对拷贝所做的修改不会影响原始数组
    ravel   返回展开的数组
    '''
    
    '''
    np.ndarry.reshape(arr,newshape,order='C')
    arr      需要修改的数组
    newshape 新的形状
    order    'C'--按行 'F'--按列  'A'--原顺序 'k'--元素在内存中的顺序
    '''
    
    arr1 = np.arange(12).reshape(2, 6)
    print(arr1)
    print('维度:', arr1.ndim)
    print('形状:', arr1.shape)
    
    arr2 = np.arange(12).reshape(2, 2, 3)
    print(arr2)
    print('维度:', arr2.ndim)
    print('形状:', arr2.shape)
    
    # -1表示当一个轴数确定后,自动计算的另一个咒术
    arr3 = np.arange(12).reshape(-1, 4)
    print(arr3)
    print('维度:', arr3.ndim)
    print('形状:', arr3.shape)
    
    arr4 = np.arange(12).reshape(3, -1)
    print(arr4)
    print('维度:', arr4.ndim)
    print('形状:', arr4.shape)
    
    print(arr3 == arr4)
    
    '''
    ravel(arr,order='C')
    order    'C'--按行 'F'--按列  'A'--原顺序 'k'--元素在内存中的顺序
    
    '''
    print(arr4.ravel())
    print(arr4.ravel('F'))
    
    '''
    flatten 与reavel函数类似,但变形后不影响原数组
    '''
    
    print(arr4.flatten())
    
    '''
    flat迭代数组元素
    一维数组和列表迭代方法一致
    '''
    arr5 = np.arange(12)
    for i in arr5:
        print(i)
    
    arr6 = arr5.reshape(3, 4)
    print(arr6)
    for item in arr6.flat:
        print(item)
    
    '''
    np.transpose(arr) 转置操作将原来的行变列,原来的列变行
    '''
    
    print(np.transpose(arr6))
    
    '''
    np.ndarry.T  一二维转置
    '''
    
    print(arr6.T)
    
    # 2.连接数组
    '''
    np.concatenate 连接两个数组,axis=0纵向组合,axis=1横向组合
    np.hstack 横向组合
    np.vstack 纵向组合
    '''
    
    arr7 = np.arange(6).reshape(2, 3)
    arr8 = np.arange(6, 12).reshape(2, 3)
    # print(arr7, arr8)
    # vstack纵向组合
    print(np.vstack((arr7, arr8)))
    # hatack横向组合
    print(np.hstack((arr7, arr8)))
    # 相当于vstack纵向组合
    print(np.concatenate((arr7, arr8), axis=0))
    # 相当于hatack横向组合
    print(np.concatenate((arr7, arr8), axis=1))
    
    # 3.切割数组
    '''
    np.hsplit() 纵向切割
    np.vsplit() 横向切割
    np.split(axis=0)  横向切割
    np.split(axis=1)  纵向切割
    '''
    arr9 = np.arange(16).reshape(4, 4)
    arr10 = np.hsplit(arr9, 2)
    print(arr10)
    print(arr10[0])
    print(arr10[0].shape)
    arr11 = np.vsplit(arr9, 2)
    print(arr11)
    print(arr11[0])
    print(arr11[0].shape)
    
    print(np.split(arr9, 2, axis=0))
    print(np.split(arr9, 2, axis=1))
    
    # 4.删除维度
    '''
    np.squeeze(arr,axis)
    删除1维的维度
    '''
    
    arr12 = np.arange(10).reshape(1, 2, 5)
    
    print(arr12, arr12.shape)
    arr13 = np.squeeze(arr12)
    print(arr13, arr13.shape)
    
    # 5.数组运算
    
    x = np.array([1, 2, 3, 4])
    y = np.array([5, 6, 7, 8])
    
    print('数组相加:', x + y)
    print('数组相减:', x - y)
    print('数组相乘:', x * y)
    print('数组相除:', x / y)
    print('数组幂运算:', x ** y)
    
    print(x > y)  # [False False False False]
    print(x < y)  # [ True  True  True  True]
    print(x == y)  # [False False False False]
    print(x <= y)  # [ True  True  True  True]
    print(x >= y)  # [False False False False]
    
    '''
    np.all()  表示逻辑and
    np.any()  表示逻辑or
    '''
    x = np.array([1, 2, 2])
    y = np.array([2, 2, 3])
    
    print(np.all(x == y))  # False
    print(np.any(x == y))  # True
    
    '''
    * 对应位置元素相乘
    np.dot 矩阵乘积
    '''
    
    print(x * y)
    print(np.dot(x, y))
    
    # 6.numpy广播
    '''
    两个数组维度形状相同时,a*b则对应位置相乘。
    如果维度形状不同则触发广播机制。
    '''
    x = np.arange(10).reshape(5, 2)
    
    y = np.array([1, 2])
    
    print(x + y)
    
    '''
    [[ 1  3]
     [ 3  5]
     [ 5  7]
     [ 7  9]
     [ 9 11]]
    '''
    print(x * y)
    '''
    [[ 0  2]
     [ 2  6]
     [ 4 10]
     [ 6 14]
     [ 8 18]]
    '''