zoukankan      html  css  js  c++  java
  • numpy库简单使用

    numpy简介

    NumPy(Numerical Python)是python语言的一个扩展程序库,支持大量维度数组与矩阵运算,此外,也针对数据运算提供大量的数学函数库。

    NumPy是高性能科学计算和数据分析的基础

    NumPy的主要功能:

    • ndarray,一个多维数组结构,高效且节省空间

    • 无需循环对整组数据进行快速运算的数学函数

    • *读写磁盘数据的工具以及用于操作内存映射文件的工具

    • *线性代数、随机数生成和傅里叶变换功能

    • *用于集成C、C++等代码的工具

    Numpy的安装

    pip install numpy

    ndarray-多维数组创建

    ndarry是多维数组结构,与列表区别:

    • 数组对象内的元素类型必须相同

    • 数组大小不可修改

    np.array()创建

    import numpy as np
    np.array()
    ​
    # 创建一维数组
    np.array([1,2,3,4,5])
    # array([1, 2, 3, 4, 5])
    ​
    # 创建二维数组
    np.array([[1,2,3],[4,5,6]])
    # array([[1, 2, 3],
           [4, 5, 6]])

    注意:

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

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

    np.array([[1,2.2,3],[4,5,6]])  # 整数都会变成浮点数
    # array([[1. , 2.2, 3. ],
           [4. , 5. , 6. ]])

    np的routines函数创建

    • np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 等差数量数组

    np.linspace(1,100,num=20)  # 产生1-100之间数量20个的等差数组
    • np.arange([start, ]stop, [step, ]dtype=None) 等差步长数组

    np.arange(0,100,step=2)  # 产生0-100,步长为2的等差数组
    • random.randint(low,high=None,size=None,dtype="1")

    np.random.randint(0,100,size=(4,5))  # size表示维度
    # array([[83, 58,  4, 20, 35],
           [13, 33, 30, 14, 79],
           [86, 58, 33, 44, 63],
           [43, 40, 55, 16, 13]])
    ​
    # 固定随机数组的随机因子,每次产生固定不变数组
    np.random.seed(10)  # 随机因子/时间种子
    np.random.randint(0,100,size=(4,5))

    ndarray属性和方法

    常用属性

    • T:数组的转置(对高维数组而言)

    img

    • dtype:数组元素的数据类型

    • size:数组元素的个数

    • ndim:数组的维数

    • shape:数组的维度大小(以元组形式)

    img_arr = plt.imread('./girl.jpg')  # 打开一张图片,获取图片的矩阵数组
    ​
    # 获取数组的维度
    img_arr.ndim
    # 3
    ​
    # 获取数组的外形
    img_arr.shape
    # (676, 1202, 3)
    ​
    # 获取数组的大小
    img_arr.size
    # 2437656
    ​
    # 获取数组的数据类型
    img_arr.dtype
    # dtype('uint8')

    常用方法

    numpy.zeros(dim1,dim2)              创建dim1*dim2的零矩阵
    numpy.arange
    numpy.eye(n) /numpy.identity(n)     创建n*n单位矩阵
    numpy.array([…data…], dtype=float64 )
    array.astype(numpy.float64)         更换矩阵的数据形式
    array.astype(float)                 更换矩阵的数据形式
    array * array                       矩阵点乘
    array[a:b]                          切片
    array.copy()                        得到ndarray的副本,而不是视图
    array [a] [b]=array [ a, b ]        两者等价
    name=np.array(['bob','joe','will']) res=name==’bob’ res= array([ True, False, False], dtype=bool)
    data[True,False,…..]                索引,只索取为True的部分,去掉False部分
    通过布尔型索引选取数组中的数据,将总是创建数据的副本。
    data[ [4,3,0,6] ]                   索引,将第4,3,0,6行摘取出来,组成新数组
    data[-1]=data[data.__len__()-1]
    numpy.reshape(a,b)                  将a*b的一维数组排列为a*b的形式
    array([a,b,c,d],[d,e,f,g])          返回一维数组,分别为[a,d],[b,e],[c,f],[d,g]
    array[ [a,b,c,d] ][:,[e,f,g,h] ]=array[ numpy.ix_( [a,b,c,d],[e,f,g,h] ) ]
    array.T                             array的转置
    numpy.random.randn(a,b)             生成a*b的随机数组
    numpy.dot(matrix_1,matrix_2)        矩阵乘法
    array.transpose( (1,0,2,etc.) )     对于高维数组,转置需要一个由轴编号组成的元组

    ndarray索引和切片、变形

    1、数组和标量之间的运算
        a+1    a*3    1//a    a**0.5
    2、同样大小数组之间的运算
        a+b    a/b    a**b
    3、数组的索引:
        一维数组:a[5]
        多维数组:
            列表式写法:a[2][3]
            新式写法:a[2,3] (推荐)
       数组的切片:
            一维数组:a[5:8]    a[4:]        a[2:10] = 1
            多维数组:a[1:2, 3:4]    a[:,3:5]        a[:,1]
    4、强调:与列表不同,数组切片时并不会自动复制,在切片数组上的修改会影响原数组。    【解决方法:copy()】

    索引

    一维数组的索引和列表一致,多维同理

    无法直接索引某一列

    arr = np.random.randint(0,100,size=(5,7))
    ​
    arr[1]  # 获取索引为1的行
    ​
    arr[[1,2]]  # 获取索引1,2的行
    ​
    arr[1,2]  # 获取行索引为1,列索引为2的值

    切片

    一维数组的切片和列表相同,多维同理

    # 获取二维数组前两行
    arr[0:2]  # 默认切片为行索引
    ​
    # 获取二维数组前两行和前两列
    arr[0:2,0:2]

    数据反转

    # 将数组的行反转
    arr[::-1]
    ​
    # 将数组的列反转
    arr[:,::-1]
    ​
    # 全部反转
    arr[::-1,::-1]

    变形

    ndarray数组可以使用arr.reshape()函数,注意参数是一个tuple

    多维数组和一维数组之间的转换

    arr = np.random.randint(0,100,size=(4,6))
    arr.shape
    ​
    # 二维变一维
    arr_1 = arr.reshape(24)
    arr_2 = arr.reshape((1,24))
    ​
    # 一维变多维
    arr_3 = arr_1.reshape((3,8))
    arr_4 = arr_1.reshape
    ​
    arr_5 = arr_1.reshape((4,-1))  # -1表示自动计算
    ​
    # 多维转多维
    arr_6 = arr.reshape((3,8))

    注意:

    • 在变形的过程中,数组的维度乘积必须是一致的,如4*6 可以变形为2*12,也可以变为8*3,1*24

    级联

    np.concatenate()

    对多个numpy数组进行横向或者纵向的拼接

    1.一维、二维、多维数组的级联,实际操作中级联为二维数组

    np.concatenate((arr,arr),axis=0)  # axis代表轴向,0表示咧,1表示行

    2.合并照片

    # 利用我们刚才打开的照片数组
    arr_3 = np.concatenate((img_arr,img_arr,img_arr),axis=1)  # 水平拼接三个数组
    arr_9 = np.concatenate((arr_3,arr_3,arr_3),axis=0)  # 垂直拼接上面拼接的图片
    plt.imshow(arr_9)  # 最终展示为9宫格的图片

    ndarray布尔类型索引

    问题:给一个数组,选出数组中所有大于5的数。

    • 答案:a[a>5] 原理: a>5会对a中的每一个元素进行判断,返回一个布尔数组 布尔型索引:将同样大小的布尔数组传进索引,会返回一个由所有True对应位置的元素的数组

    问题2:给一个数组,选出数组中所有大于5的偶数。

    问题3:给一个数组,选出数组中所有大于5的数和偶数。

    • 答案: a[(a>5) & (a%20)] a[(a>5) | (a%20)]

    import numpy as np
    a = np.array([1,2,3,4,5,4,7,8,9,10])
    a[a>5&(a%2==0)]  # 注意加括号,不叫括号错误,如下
    # array([ 1,  2,  3,  4,  5,  4,  7,  8,  9, 10])
    ​
    a[(a>5)&(a%2==0)]
    # array([ 8, 10])

    ndarray聚合函数

    • numpy.sum():求和函数

    • numpy.max()/min():最大值/最小值

    • numpy.mean():平均值

    • cumsum:求前缀和

    • std:求标准差

    • var:求方差

    • argmin:求最小值索引

    • argmax:求最大值索引

    arr.sum(axis=1)  # 列向求和
    arr.max(axis=1)  # 列向最大值
    arr.mean(axis=1)  # 列向平均值

    其他聚合函数

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

    ndarray排序

    numpy.sort()和ndarray.sort()都可以排序,稍有区别

    numpy.sort(arr,axis=0)  # 返回一个新的排序好的对象,arr并没有改变
    ​
    arr.sort(axis=0)  # arr直接被改变了

     

  • 相关阅读:
    BAT脚本打印空行的使用方法
    Shell脚本关于屏幕输出的字符进行颜色控制的问题
    shell脚本中切换用户执行相应的命令或者shell脚本的方法
    Linux下执行的java命令重定向到文件中的方法
    解决Firefox浏览器每次打开都弹出导入向导的问题
    解决Ruby在IE11中报Unable to get browser (Selenium::WebDriver::Error::NoSuchWindowError)的错误
    6月28日 Django form组件 和 modelform组件
    6月27日 ajax
    6月25日 Django 分页 cookie、session
    6月26日 Django 中间件
  • 原文地址:https://www.cnblogs.com/ryxiong-blog/p/11342388.html
Copyright © 2011-2022 走看看