python模块 - numpy

Posted yangjunh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python模块 - numpy相关的知识,希望对你有一定的参考价值。

numpy - 基础数组操作

基础

  • 数据分析及机器学习底层库,C语言实现,提供基础数值计算

  • 核心是多维数组的操作,减少python对多维数组操作时的循环

  • numpy.ndarray类表示n维数组类

  • ndarray对象在内存中储存内容

    • 元数据:描述数组信息,如ndim、dimensions、dtype、data等
    • 实际数据:和元数据分离,一定程度减少实际数据访问,提高性能
  • 特点

    • 同质性:数组所有元素必须是相同类型
    • 数组下标:从0开始

array对象

数据类型

类型 符号 字符码(进行类型转换,自定义符合类型标注)
布尔 bool_ ?
有符号整数 int8(-128~127)/int16/32/64 i1/i2/i4/i8
无符号整数 uint8(0~255)/uint16/32/64 u1/u2/u4/u8
浮点数 float/16/32/64 f2/f4/f8
复数 complex64/128 c8/c16
字符串 str_ U<字符数>
日期 datetime64 M8[Y] M8[M] M8[D] M8[h] M8[m] M8[s]
  • 日期 datetime64

    • 常见格式:‘年‘, ‘年-月-日‘, ‘年-月-日 时:分:秒‘
    • 规范化:可对不同精确度的时间精确到统一时间单位 array.astype(‘M8[Y/M/D/h/m/s]‘)
    • 可进行减操作得到时间差,精确到数据中最小时间单位
  • 自定义复合类型

    # 实例
    data=[
    	(‘zs‘, [90, 80, 85], 15),
    	(‘ls‘, [92, 81, 83], 16),
    	(‘ww‘, [95, 85, 95], 15)
    ]
    
    # 方法一:字符串对应每条数据格式
    # 创建
    a = numpy.array(data,dtype=‘U3, 3int32, int32‘)
    # 访问
    a[0][‘f0‘] # ‘zs‘
    
    # 方法二:字典对应每条数据字段名称
    # 创建
    c = np.array(data, dtype={‘names‘: [‘name‘, ‘scores‘, ‘ages‘],
                              ‘formats‘: [‘U3‘, ‘3int32‘, ‘int32‘]})
    # 访问
    c[0][‘name‘] # ‘zs‘
    # 方法三:列表对应每条数据字段名称
    # 创建
    b = np.array(data, dtype=[(‘name‘, ‘str_‘, 2),
                        	  (‘scores‘, ‘int32‘, 3),
                        	  (‘ages‘, ‘int32‘, 1)])
    # 访问
    b[0][‘name‘] # ‘zs‘
    

创建:

  • numpy.array([]) 普通一维数组
  • numpy.arange(start,end,step) 从起始值到终止值按指定步长生成数组
  • numpy.zeros(count,dtype=‘类型‘) 生成count个0组成的一维数组
  • numpy.ones(count,dtype=‘类型‘) 生成count个1组成的一维数组

属性

可查看和修改部分属性

  • 维度(每层元素个数) array.shape
  • 维数 array.ndim
  • 元素类型 array.dtype
  • 个数类
    • 总元素个数 array.size [[1,2],[3,4]]的size为4
    • 最外层元素数 len(array) [[1,2],[3,4]]的len为2
    • 元素字节数 itemsize
    • 总字节数 nvytes
  • 复数
    • 实数部 real
    • 虚数部 iamg
  • 迭代器 flat
  • array[索引] [0][0][0]==[0,0,0]

操作

  • 偏移缩放转置:

    • 每个元素进行相同操作
    • +、-、*、/、**、T
  • 遍历(扁平迭代器)

    • elem for elem in a.flat
  • 类型转换:

    • array.astype(type) 类型强制转换
  • 变维:

    • 就地变维:改变源数据格式
    • 视图变维:数据不同展示形式
    • 复制变维:复制出新的独立数据
    变维类型 方法 描述 数据是否共享
    就地变维 shape() 转为指定格式,无返回值 共享(本身)
    就地变维 resize() 转为指定格式,无返回值 共享(本身)
    视图变维 reshape() 转为指定格式,返回新数组对象 共享(同一数据)
    视图变维 reval() 退化为一维,返回新数组对象 共享共享(同一数据)
    复制变维 flatten() 退化为一维,返回新数组对象 不共享(不同数据)
    array1 = numpy.arange(1,9) # 1*8 一维数组
    array1.shape(2,4) # 2*4 二维数组
    array1.resize(2,4) # 2*4 二维数组
    array2 = array1.reshape(2,4) # 2*4 二维数组
    
    array1 = numpy.arange(1,9) # 1*8 一维数组
    array1.shape(2,2,2) # 2*2*2 三维数组
    array1.resize(2,2,2) # 2*2*2 三维数组
    array3 = array1.reshape(2,2,2) # 2*2*2 三维数组
    array4 = array3.reval() # 1*8 一维数组
    
    array1 = numpy.arange(1,9) # 1*8 一维数组
    array5 = array1.flatten() # 1*8 一维数组
    
    array1,array2,array3,array4 共享数据
    array5 独立数据
    
    案例:
    生成3*3*3的三维数组,元素为1到27
    array1 = numpy.arange(1,28).resize(3,3,3)
    
  • 切片:

    • array([start: end: step,start: end: step,start: end: step])根据维度切出指定页行列
    # 一维数组
    a = numpy.arange(1, 10)
    # 1 2 3 4 5 6 7 8 9
    # 正序
    print(a[::])  # 1 2 3 4 5 6 7 8 9
    print(a[:])  # 1 2 3 4 5 6 7 8 9
    # 倒序
    print(a[::-1])  # 9 8 7 6 5 4 3 2 1
    # 省略start,倒推到边界,step=1就end-1倒推,step=-1就end+1倒推
    print(a[:4:-1])  # 9 8 7 6 相当于[8:4:-1]
    print(a[:-4:-1])  # 9 8 7 相当于[-1:-4:-1]
    # 省略end,正推到边界,step=1就start+1正推,step=-1就start-正推
    print(a[7::-1])  # 8 7 6 5 4 3 2 1 相当于[7:-1:-1]
    print(a[-7::-1])  # 3 2 1 相当于[-7:-10:-1]
    
  • 掩码:根据指定条件进行筛选

    array = numpy.arange(1, 5)
    mask = [True, False,True, False,True]
    print(array[mask])
    # array([1,3,5])
    print(array[array>3])
    # array([4,5])
    print(array>3)
    # array([False, False,True, True,True])
    
  • 合并拆分

    • 水平方向

      • 合并 c = numpy.hstack((a,b))/row_stack((a,b))

      • 等分a,b = numpy.hsplit(c,2)

        a = numpy.arange(1,1+6).reshape(2,3)
        # array([[1,2,3],
        #		 [4,5,6]])
        b = numpy.arange(1+6,1+12).reshape(2,3)
        # array([[7,8,9],
        #		 [10,11,12]])
        c = numpy.hstack((a,b))
        # array([[1,2,3,7,8,9],
        #		 [4,5,6,10,11,12]])
        d,e = numpy.hsplit(c,2)
        # d同a,e同b
        
    • 垂直方向

      • 合并c = numpy.vstack((a,b))/column_stack((a,b))

      • 等分a,b = numpy.vsplit(c,2)

        a = numpy.arange(1,1+6).reshape(2,3)
        # array([[1,2,3],
        #		 [4,5,6]])
        b = numpy.arange(1+6,1+12).reshape(2,3)
        # array([[7,8,9],
        #		 [10,11,12]])
        c = numpy.vstack((a,b))
        # array([[1,2,3],
        #		 [4,5,6],
        #        [7,8,9],
        #		 [10,11,12]])
        d,e = numpy.vsplit(c,2)
        # d同a,e同b
        
    • 深度方向

      • 合并c = numpy.dstack((a,b)),等分a,b = numpy.dsplit(c,2)

        a = numpy.arange(1,1+6).reshape(2,3)
        # array([[1,2,3],
        #		 [4,5,6]])
        b = numpy.arange(1+6,1+12).reshape(2,3)
        # array([[7,8,9],
        #		 [10,11,12]])
        c = numpy.dstack((a,b))
        # array([[[1,7],
        #         [2,8],
        #         [3,9]],
        #        [[4,10],
        #         [5,11],
        #         [6,12]]])
        d,e = numpy.dsplit(c,2)
        # array([[[1],
        #         [2],
        #         [3]],
        #        [[4],
        #         [5],
        #         [6]]])
        
    • 通用方法

      • 合并c = numpy.concatenate((a,b),axis=0)
      • 等分a,b = numpy.dsplit(c,2,,axis=0)

以上是关于python模块 - numpy的主要内容,如果未能解决你的问题,请参考以下文章

导入 numpy 模块时出现 Python 错误 [重复]

进阶第十五课 Python模块之Numpy

7.+利用numpy的random模块,创建一个4行5列的数组,各元素的值为0-100的随?

python中怎样安装numpy模块

乐哥学AI_Python:Numpy索引,切片,常用函数

Python---NumPy模块