美文网首页 移动 前端 Python Android Java
大师兄的Python机器学习笔记:Numpy库、Scipy库和M

大师兄的Python机器学习笔记:Numpy库、Scipy库和M

作者: superkmi | 来源:发表于2020-02-27 19:16 被阅读0次

    大师兄的Python机器学习笔记:统计学基础之底层代码实现(二)
    大师兄的Python机器学习笔记:Numpy库、Scipy库和Matplotlib库(二)

    一、关于Numpy、Scipy和Matplotlib

    • Numpy和Scipy库是Python中重要的科学计算库,Matplotlib是画图库,这三个库结合起来通常作为Matlab的开源解决方案。
    • 他们都是开源项目,会随着Anaconda一起安装,当然也可以单独安装。
    • Python还有很多机器学习库。

    二、Numpy库

    1. Numpy的主要功能
    • 数组的计算和逻辑运算。
    • 傅立叶变换(Fourier transformation)和图形处理中的应用。
    • 与线性代数有关的操作。
    • 实现数组并行计算。
    2. Ndarray对象
    • 也称为N维数组,是Numpy中最基本的数据结构。
    • 用于描述相同类型的元素集合。
    • ndarray中的每个元素都是相同大小的多维数组。
    • 与Python中的list有相似的部分
    >>>import numpy as np
    >>>np_sample1 = np.array(["北京","上海","广州","深圳"])
    >>>print(np_sample1) # 与list不同,ndarray不用','分隔
    ['北京' '上海' '广州' '深圳']
    

    2.1 Ndarray对象组成结构

    • 一个指向数据的指针。
    • 数据类型或dtype,也就是若干个固定大小的数据结构。
    • shape:一个表示数组结构的元祖。
    • stride: 跨度元祖,表示每个元素的字节数。

    2.2 Ndarray对象的参数

    • numpy.array(object,dtype=None,copy=True,order=None,subok=False,ndmin=0)
    参数 含义
    object 数组或嵌套的数列
    dtype 数组元素的数据类型,可选
    copy 对象是否需要复制,可选
    order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
    subok 默认返回一个与基类类型一致的数组
    ndmin 指定生成数组的最小维度
    # 二维数组
    >>>np_sample2 = np.array([["北京",1],["上海",2],["广州",3],["深圳",4]],ndmin=2)
    >>>print(np_sample2)
    [['北京' '1']
    ['上海' '2']
    ['广州' '3']
    ['深圳' '4']]
    

    2.3 dtype数据类型

    • numpy支持的数据类型比Python多,包括:
    数据类型 描述
    bool_ 存储为一个字节的布尔值(真或假)
    int_ 默认整数,相当于 C 的long,通常为int32或int64
    intc 相当于 C 的int,通常为int32或int64
    intp 用于索引的整数,相当于 C 的size_t,通常为int32或int64
    int8 字节(-128 ~ 127)
    int16 16 位整数(-32768 ~ 32767)
    int32 32 位整数(-2147483648 ~ 2147483647)
    int64 64 位整数(-9223372036854775808 ~ 9223372036854775807)
    uint8 8 位无符号整数(0 ~ 255)
    uint16 16 位无符号整数(0 ~ 65535)
    uint32 32 位无符号整数(0 ~ 4294967295)
    uint64 64 位无符号整数(0 ~ 18446744073709551615)
    float_ float64的简写
    float16 半精度浮点:符号位,5 位指数,10 位尾数
    float32 单精度浮点:符号位,8 位指数,23 位尾数
    float64 双精度浮点:符号位,11 位指数,52 位尾数
    complex_ complex128的简写
    complex64 复数,由两个 32 位浮点表示(实部和虚部)
    complex128 复数,由两个 64 位浮点表示(实部和虚部)
    # 指定数据类型
    >>>np_sample2 = np.array([1,2,3,4,5],dtype='float64') 
    >>>print(np_sample2)
    [1. 2. 3. 4. 5.]
    

    2.4 ndarray.shape数组结构

    • 返回数组维度的元祖。
    • 可以用来调整数组大小。
    >>>import numpy as np
    >>>n = np.array([['北京',1],['上海',2],['广州',3],['深圳',4]]) # 返回数组的大小
    >>>print(n.shape)
    (4, 2)
    
    >>>n.shape = (1,8) # 调整数据大小
    >>>print(n)
    [['北京' '1' '上海' '2' '广州' '3' '深圳' '4']]
    

    2.5 ndarray.ndim数组维数

    • 返回数组的维数。
    >>>import numpy as np
    >>>n = np.array([['北京',1],['上海',2],['广州',3],['深圳',4]])
    >>>print(n.ndim)
    2
    

    2.6 ndarray.reshape()重构数组

    • 返回一个重构的新数组。
    >>>import numpy as np
    >>>n1 = np.array([['北京',1],['上海',2],['广州',3],['深圳',4]])
    >>>n2 = n1.reshape(2,2,2)
    >>>print(n2)
    [[['北京' '1']
     ['上海' '2']]
    
    [['广州' '3']
     ['深圳' '4']]]
    

    2.7 numpy.itemsize

    • 返回数组中每个元素的字节单位长度。
    >>>import numpy as np
    >>>n = np.array([['北京',1],['上海',2],['广州',3],['深圳',4]],dtype='str')
    >>>print(n.itemsize) # 每个元素8个字节
    8
    

    2.8 numpy.flags

    • 返回ndarray的当前属性。
    • 这些属性包括:
    属性 描述
    C_CONTIGUOUS (C) 数组位于单一的、C 风格的连续区段内
    F_CONTIGUOUS (F) 数组位于单一的、Fortran 风格的连续区段内
    OWNDATA (O) 数组的内存从其它对象处借用
    WRITEABLE (W) 数据区域可写入。 将它设置为flase会锁定数据,使其只读
    ALIGNED (A) 数据和任何元素会为硬件适当对齐
    UPDATEIFCOPY (U) 这个数组是另一数组的副本。当这个数组释放时,源数组会由这个数组中的元素更新
    >>>import numpy as np
    >>>n = np.array([['北京',1],['上海',2],['广州',3],['深圳',4]],dtype=str)
    >>>print(n.flags)
    C_CONTIGUOUS : True
    F_CONTIGUOUS : False
    OWNDATA : True
    WRITEABLE : True
    ALIGNED : True
    WRITEBACKIFCOPY : False
    UPDATEIFCOPY : False
    
    3. 创建新数组
    • 可以通过以下任意方法创建数组。

    3.1 numpy.empty(<shape>,<Dtype>,<Order>)

    • 创建一个未初始化的数组。
    • 元素为随机值。
    • 属性包括:
    参数 描述
    Shape 空数组的形状,整数或整数元组
    Dtype 所需的输出数组类型
    Order 'C'为按行的 C 风格数组,'F'为按列的 Fortran 风格数组
    >>>import numpy as np
    >>>n = np.empty([4,6],'int64','C')
    >>>print(n)
    [[ 836  836  856  856  984  984]
    [ 988  988  596  596 1036 1036]
    [1292 1292 1300 1300 1116 1116]
    [1312 1312 1128 1128 1328 1328]]
    

    3.2 numpy.zeros(<shape>,<dtype>)

    • 创建一个数组,并用0作为初始元素。
    >>>import numpy as np
    >>>n = np.zeros([4,6])
    >>>print(n)
    [[0. 0. 0. 0. 0. 0.]
    [0. 0. 0. 0. 0. 0.]
    [0. 0. 0. 0. 0. 0.]
    [0. 0. 0. 0. 0. 0.]]
    

    3.3 numpy.ones(<shape>,<dtype>,<order>)

    • 创建一个新数组,并用1作为初始元素。
    >>>import numpy as np
    >>>n = np.ones([3,5],int,"F")
    >>>print(n)
    [[1 1 1 1 1]
    [1 1 1 1 1]
    [1 1 1 1 1]]
    
    4. 通过数据创建新数组
    • 将现有的Python数据类型转换为N数组。

    4.1 numpy.asarray(<a>,<dtype>,<order>)

    • 将任意输入数组参数<a>转换为N数组。
    >>>import numpy as np
    >>>n1 = np.asarray(['a','b','c'])  # list()
    >>>print(n1)
    ['a' 'b' 'c']
    
    >>>n2 = np.asarray((1,2,3),int,'C') # tuple()
    >>>print(n2)
    [1 2 3]
    
    >>>n3 = np.asarray([(1,2,3),(4,5,6),[7,8,9]]) # 数组结构
    >>>print(n3)
    [[1 2 3]
    [4 5 6]
    [7 8 9]]
    

    4.2 numpy.frombuffer(<buffer>,<dtype>,<count>,<offset>)

    • 将缓冲区对象转换为N数组。
    • 参数解释:
    参数 描述
    buffer 任何暴露缓冲区借口的对象
    dtype 返回数组的数据类型,默认为float
    count 需要读取的数据数量,默认为-1,读取所有数据
    offset 需要读取的起始位置,默认为0
    >>>import numpy as np
    >>>s =  b'123 456 789'
    >>>a = np.frombuffer(s, dtype =  'S1')
    >>>print(a)
    [b'1' b'2' b'3' b' ' b'4' b'5' b'6' b' ' b'7' b'8' b'9']
    

    4.3 numpy.fromiter(<iterable>,<dtype>,<count>)

    • 从任何可迭代对象构建N数组。
    >>>import numpy as np
    >>>l = (n for n in range(20)) # 可迭代生成器
    >>>n = np.fromiter(l,'int32')
    >>>print(n)
    [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
    
    5. 通过数值范围创建新数组

    5.1 numpy.arange(<start>,<stop>,<step>,<dytype>)

    • 根据给定的范围和间隔值生成N数组。
    • 参数含义:
    序号 参数及描述
    start 范围的起始值,默认为0
    stop 范围的终止值(不包含)
    step 两个值的间隔(步长),默认为1
    dtype 返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。
    >>>import numpy as np
    >>>n = np.arange(10,100,10,"int64")
    >>>print(n)
    [10 20 30 40 50 60 70 80 90]
    

    5.2 numpy.linspace(<start>,<stop>,<num>,<endpoint>,<retstep>,<dtype>)

    • 通过固定范围内,元素的均匀数量生成N数组。
    • 参数含义:
    序号 参数及描述
    start 序列的起始值
    stop 序列的终止值,如果endpoint为true,该值包含于序列中
    num 要生成的等间隔样例数量,默认为50
    endpoint 序列中是否包含stop值,默认为ture
    retstep 如果为true,返回样例,以及连续数字之间的步长
    dtype 输出ndarray的数据类型
    >>>import numpy as np
    >>>n = np.linspace(10,100,25,False,True)
    >>>print(n)
    (array([10. , 13.6, 17.2, 20.8, 24.4, 28. , 31.6, 35.2, 38.8, 42.4, 46. ,
          49.6, 53.2, 56.8, 60.4, 64. , 67.6, 71.2, 74.8, 78.4, 82. , 85.6,
          89.2, 92.8, 96.4]), 3.6)
    

    5.3 numpy.logspace(<start>,<stop>,<num>,<endpoint>,<base>,<dtype>)

    • 通过在两个固定底数幂的范围内,元素的均匀数量生成N数组。
    • 参数含义:
    序号 参数及描述
    start 起始值是base ** start
    stop 终止值是base ** stop
    num 范围内的数值数量,默认为50
    endpoint 如果为true,终止值包含在输出数组当中
    base 对数空间的底数,默认为10
    dtype 输出数组的数据类型,如果没有提供,则取决于其它参数
    >>>import numpy as np
    >>>n = np.logspace(start=1,stop=10,num=20,base=2)
    >>>print(n)
    [   2.            2.77730229    3.85670399    5.3556164     7.43708284
      10.32751358   14.34131354   19.91508143   27.65510059   38.40328703
      53.32876841   74.05505519  102.836637    142.80421347  198.30523421
     275.37679007  382.40229418  531.02338276  737.40622722 1024.        ]
    
    6. N数组的访问和修改。

    6.1 通过切片访问和修改

    • 可以像list一样切片。
    • 也可以通过slice(<start>,<stop>,<step>)获取数组的一部分。
    >>>import numpy as np
    >>>n = np.arange(1,10,1)
    >>>s1 = n[4]
    >>>print(s1)
    5
    
    >>>s2 = slice(2,8,2)
    >>>print(n[s2])
    array([3, 5, 7])
    

    6.2 通过索引访问和修改

    • 可以像list一样通过索引访问。
    >>>s1 = n[2:8:3]
    >>>print(s1)
    [3 6]
    
    >>>s2 = n[2:]
    >>>print(s2)
    [3 4 5 6 7 8 9]
    

    6.3 高级索引

    • 如果是非元祖序列, 数据类型为整数或布尔值,或包含序列,就可以使用高级序列。
    • 有两种高级序列:整数和布尔值。

    1)整数索引

    • 从多维数组的索引,行号和下标返回N数组。
    >>>import numpy as np
    >>>x = np.asarray([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]])
    # 通过行号和下标
    >>>y = x[[0,1,2],[0,1,2]]
    >>>print(y)
    [ 1  7 13]
    
    # 通过索引和下标返回
    >>>z = x[1:3,[1,4]]
    >>>print(z)
    [[ 7 10]
    [12 15]]
    

    2)布尔索引

    • 可以用布尔运算的方式索引N数组。
    # 通过布尔运算值过滤N数组
    >>>import numpy as np
    >>>n = np.asarray([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]])
    >>>print(n[n<7])
    [1 2 3 4 5 6]
    
    • np.nan在N数组中表示空值。
    # 过滤np.nan
    >>>import numpy as np
    >>>a = np.array([np.nan,  1,2,np.nan,3,4,5])
    >>>print(a[~np.isnan(a)]) # ~在数位运算中表示逐位取反0->1, 1->0
    [1. 2. 3. 4. 5.]
    
    • 通过判断元素类型索引N数组。
    # 获得N数组中复数的元素
    >>>import numpy as np
    >>>n = np.asarray([[1,2,3,8+5j,5],[6,7,5+2j,9,10],[11,1+9j,13,14,15]])
    >>>print(n[np.iscomplex(n)])
    [8.+5.j 5.+2.j 1.+9.j]
    
    7. N数组的广播和迭代。

    7.1 N数组的广播

    • 广播指的是N数组处理不同形状数组的能力。

    1) 两个形状相同的数组处理

    • 如果两个数组相同,则无缝对等处理。
    >>>import numpy as np
    >>>l1 = np.asarray([1,2,3,4,5])
    >>>l2 = np.asarray([2,4,6,8,10])
    >>>l3 = l1*l2
    >>>print(l3)
    [ 2  8 18 32 50]
    

    2) 两个维度不同的数组处理

    • 如果两个数组维度不同,但较小维度的数组长度为1,则将较小的数组对应较大数组的每个元素处理。
    >>>import numpy as np
    >>>l1 = np.asarray([[1,2,3,4,5],[10,11,12,13,14],[20,21,22,23,24]])
    >>>l2 = np.asarray([2,4,6,8,10])
    >>>l3 = l1*l2
    >>>print(l3)
    [[  2   8  18  32  50]
    [ 20  44  72 104 140]
    [ 40  84 132 184 240]]
    
    # 更极端的例子
    >>>import numpy as np
    >>>l1 = np.asarray([[[1,2,3,4,5],[10,11,12,13,14],[20,21,22,23,24]],[[1,2,3,4,5],[10,11,12,13,14],[20,21,22,23,24]]])
    >>>l2 = np.asarray(4)
    >>>l3 = l1*l2
    >>>print(l3)
    [[[ 4  8 12 16 20]
     [40 44 48 52 56]
     [80 84 88 92 96]]
    
    [[ 4  8 12 16 20]
     [40 44 48 52 56]
     [80 84 88 92 96]]]
    

    7.2 N数组的迭代

    1) N数组的内置迭代器: numpy.nditer()

    • 与Iterator迭代器类似。
    • 可以实现多维数组的迭代。
    >>>import numpy as np
    >>>n = np.asarray([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]])
    >>>l = list()
    >>>for x in np.nditer(n):
    >>>    l.append(x)
    >>>print(l)
    [array(1), array(2), array(3), array(4), array(5), array(6), array(7), array(8), array(9), array(10), array(11), array(12), array(13), array(14), array(15)]
    

    2) 迭代顺序

    • 可以通过参数<order>强制迭代顺序:
    • 'C'风格:C语言格式。例:1,2,3,4,5,6,7,8,9
    • 'F'风格:Fortran语言格式。例:1,4,7,2,5,8,3,6,9
    >>>import numpy as np
    >>>n = np.arange(0,100,5)
    >>>n = n.reshape(2,2,5)
    >>>l = list()
    >>>for x in np.nditer(n,order='C'):
    >>>    l.append(x)
    >>>print(l)
    [array(0), array(5), array(10), array(15), array(20), array(25), array(30), array(35), array(40), array(45), array(50), array(55), array(60), array(65), array(70), array(75), array(80), array(85), array(90), array(95)]
    
    >>>l = list()
    >>>for x in np.nditer(n,order='F'):
    >>>    l.append(x)
    >>>print(l)
    [array(0), array(50), array(25), array(75), array(5), array(55), array(30), array(80), array(10), array(60), array(35), array(85), array(15), array(65), array(40), array(90), array(20), array(70), array(45), array(95)]
    

    3) 迭代并修改参数值

    • 通过修改参数<op_flags=['read']>为['readwrite']可以允许数组在迭代时被修改。
    >>>import numpy as np
    >>>n = np.arange(0,10,2)
    >>>for x in np.nditer(n,op_flags=['readwrite']):
    >>>    x += 1
    >>>print(n)
    [1 3 5 7 9]
    

    4) 迭代返回多个值的一堆数组

    • 可以通过参数<flags=['external_loop']>实现功能。
    >>>import numpy as np
    >>>n = np.arange(0,20,2)
    >>>n = n.reshape(2,5)
    >>>m = [x for x in np.nditer(n,flags=['external_loop'],order='F')]
    >>>print(m)
    [array([ 0, 10]), array([ 2, 12]), array([ 4, 14]), array([ 6, 16]), array([ 8, 18])]
    

    5) 广播迭代

    • 如果两个数组可广播,则他们可以同时被迭代。
    >>>import numpy as np
    >>>a = np.arange(0,20,2)
    >>>b = np.arange(20,40,2)
    >>>a = a.reshape(2,5)
    >>>b = b.reshape(2,5)
    >>>for a,b, in np.nditer([a,b]):
    >>>    print(a+b)
    20
    24
    28
    32
    36
    40
    44
    48
    52
    56
    
    8. N数组的数组操作。

    8.1 变形操作

    1) numpy.reshape

    • 重组数据形状。
    >>>import numpy as np
    >>>n = np.arange(0,20,2)
    >>>m = n.reshape(2,5)
    >>>print(m)
    [[ 0  2  4  6  8]
    [10 12 14 16 18]]
    

    2) numpy.ndarray.flat

    • 返回数组的一维迭代器。
    >>>import numpy as np
    >>>n = np.arange(0,20,2)
    >>>m = n.reshape(2,5)
    >>>print(m.flat)
    <numpy.flatiter object at 0x000001B70608C7D0>
    

    3) numpy.ndarray.flatten(<order>)

    • 将数组折叠为一维数组,并返回一份复制。
    • <order>顺序包括:
    顺序 含义
    'C'
    'F'
    'A' 原顺序
    'K' 元素在内存中的顺序
    >>>import numpy as np
    >>>n = np.asarray([[[1,2,3,4,5],[10,11,12,13,14],[20,21,22,23,24]],[[1,2,3,4,5],[10,11,12,13,14],[20,21,22,23,24]]])
    >>>m = n.flatten('C')
    >>>print(m)
    [ 1  2  3  4  5 10 11 12 13 14 20 21 22 23 24  1  2  3  4  5 10 11 12 13
    14 20 21 22 23 24]
    

    4) numpy.ravel(<ndarray>,<order>)

    • 与flattern类似,将数组折叠为一维数组,但返回的是视图。
    >>>import numpy as np
    >>>n = np.asarray([[[1,2,3,4,5],[10,11,12,13,14],[20,21,22,23,24]],[[1,2,3,4,5],[10,11,12,13,14],[20,21,22,23,24]]])
    >>>np.ravel(m,'C')
    array([ 1,  2,  3,  4,  5, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24,  1,  2,
           3,  4,  5, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24])
    

    8.2 翻转操作

    1) numpy.transpose(<arr>,<axes=0>)

    • 将N数组<arr>翻转。
    • <axes>表示坐标方向。
    >>>import numpy as np
    >>>n = np.arange(0,20).reshape(2,5,2) 
    >>>print(n) # 翻转前
    [[[ 0  1]
     [ 2  3]
     [ 4  5]
     [ 6  7]
     [ 8  9]]
    
    [[10 11]
     [12 13]
     [14 15]
     [16 17]
     [18 19]]]
    >>>np.transpose(n) # 翻转后
    array([[[ 0, 10],
           [ 2, 12],
           [ 4, 14],
           [ 6, 16],
           [ 8, 18]],
    
          [[ 1, 11],
           [ 3, 13],
           [ 5, 15],
           [ 7, 17],
           [ 9, 19]]])
    

    2) numpy.ndarray.T

    • 简单翻转,相当于numpy.transpose(<arr>,<axes=0>)。
    >>>import numpy as np
    >>>n = np.arange(0,20).reshape(2,5,2)
    >>>print(n) # 翻转前
    [[[ 0  1]
     [ 2  3]
     [ 4  5]
     [ 6  7]
     [ 8  9]]
    
    [[10 11]
     [12 13]
     [14 15]
     [16 17]
     [18 19]]]
    >>>n.T # 翻转后
    array([[[ 0, 10],
           [ 2, 12],
           [ 4, 14],
           [ 6, 16],
           [ 8, 18]],
    
          [[ 1, 11],
           [ 3, 13],
           [ 5, 15],
           [ 7, 17],
           [ 9, 19]]])
    

    3) numpy.rollaxis(<arr>,<axis>,<start=0>)

    • 将N数组<arr>的下标滚动到特定位置。
    • <axis>表示要滚动的轴,其他轴的位置不会变。
    • <start>表示开始滚动的位置。
    >>>import numpy as np
    >>>n = np.arange(0,8).reshape(2,2,2)
    >>>print(n) # 滚动之前
    [[[0 1]
     [2 3]]
    
    [[4 5]
     [6 7]]]
    >>>np.rollaxis(n,1,0) # 滚动后
    array([[[0, 1],
           [4, 5]],
    
          [[2, 3],
           [6, 7]]])
    

    4) numpy.swapaxes(<arr>,<axis1>,<axis2>)

    • 将N数组<arr>的<axis1>轴和<axis2>轴交换。
    >>>import numpy as np
    >>>n = np.arange(0,8).reshape(2,2,2)
    >>>print(n) # 交换前
    [[[0 1]
     [2 3]]
    
    [[4 5]
     [6 7]]]
    >>>np.swapaxes(n,1,2) # 交换后
    array([[[0, 2],
           [1, 3]],
    
          [[4, 6],
           [5, 7]]])
    

    8.3 修改维度

    1) numpy.broadcast(<arr1>,<arr2>)

    • 返回一个数组<arr1>广播到另一个数组<arr2>的结果。
    >>>import numpy as np
    >>>n1 = np.arange(0,8).reshape(8,1)
    >>>n2 = np.arange(10,20,2)
    >>>n3 = np.broadcast(n1,n2)
    >>>print(list(n3))
    [(0, 10), (0, 12), (0, 14), (0, 16), (0, 18), (1, 10), (1, 12), (1, 14), (1, 16), (1, 18), (2, 10), (2, 12), (2, 14), (2, 16), (2, 18), (3, 10), (3, 12), (3, 14), (3, 16), (3, 18), (4, 10), (4, 12), (4, 14), (4, 16), (4, 18), (5, 10), (5, 12), (5, 14), (5, 16), (5, 18), (6, 10), (6, 12), (6, 14), (6, 16), (6, 18), (7, 10), (7, 12), (7, 14), (7, 16), (7, 18)]
    

    2) numpy.broadcast_to(<arr>,<shape>,<subok=False>)

    • 将N数组<arr>广播为新的形状<shape>
    • 如果<subok>为True,则与基类类型一致。
    >>>import numpy as np
    >>>n = np.arange(0,8).reshape(8,1)
    >>>np.broadcast_to(n,(8,3))
    array([[0, 0, 0],
          [1, 1, 1],
          [2, 2, 2],
          [3, 3, 3],
          [4, 4, 4],
          [5, 5, 5],
          [6, 6, 6],
          [7, 7, 7]])
    

    3) numpy.expand_dims(<arr>,<axis>)

    • 在N数组<arr>中的指定维度<axis>增加新的轴来扩展数组的维度。
    >>>import numpy as np
    >>>n = np.arange(0,8).reshape(4,2)
    >>>print(n)
    [[0 1]
    [2 3]
    [4 5]
    [6 7]]
    >>>np.expand_dims(n,1)
    array([[[0, 1]],
    
          [[2, 3]],
    
          [[4, 5]],
    
          [[6, 7]]])
    

    4) numpy.squeeze(<arr>,<axis>)

    • 从N数组<arr>的删除指定维度<axis>。
    >>>import numpy as np
    >>>n = np.arange(0,8).reshape(1,2,4)
    >>>print(n) # 删除前
    [[[0 1 2 3]
     [4 5 6 7]]]
    >>>np.squeeze(n) # 删除后
    array([[0, 1, 2, 3],
          [4, 5, 6, 7]])
    

    8.4 连接数组
    1) numpy.concatenate((<arr1>,<arr2>...),<axis>)

    • 沿指定轴<axis>连接n个数组。
    >>>import numpy as np
    >>>n1 = np.arange(0,8).reshape(2,4)
    >>>n2 = np.arange(9,13).reshape(2,2)
    >>>print(n1)
    [[0 1 2 3]
    [4 5 6 7]]
    >>>print(n2)
    [[ 9 10]
    [11 12]]
    >>>n3 = np.concatenate((n1,n2),1)
    >>>print(n3)
    [[ 0  1  2  3  9 10]
    [ 4  5  6  7 11 12]]
    

    2) numpy.stack((<arr1>,<arr2>...),<axis>)

    • 沿指定的轴增加新的数组。
    • 所有的N数组必须是相同的形状。
    >>>import numpy as np
    >>>n1 = np.arange(0,8).reshape(2,4)
    >>>n2 = np.arange(9,17).reshape(2,4)
    >>>print(n1)
    [[0 1 2 3]
    [4 5 6 7]]
    >>>print(n2)
    [[ 9 10 11 12]
    [13 14 15 16]]
    >>>n3 = np.stack((n1,n2),0)
    >>>print(n3)
    [[[ 0  1  2  3]
     [ 4  5  6  7]]
    
    [[ 9 10 11 12]
     [13 14 15 16]]]
    

    3) numpy.hstack((<arr1>,<arr2>...),<axis>)

    • 与numpy.stack()相同,但堆叠方向固定为水平方向。
    >>>import numpy as np
    >>>n1 = np.arange(0,8).reshape(2,4)
    >>>n2 = np.arange(9,17).reshape(2,4)
    >>>print(n1)
    [[0 1 2 3]
    [4 5 6 7]]
    >>>print(n2)
    [[ 9 10 11 12]
    [13 14 15 16]]
    >>>n3 = np.hstack((n1,n2))
    >>>print(n3)
    [[ 0  1  2  3  9 10 11 12]
    [ 4  5  6  7 13 14 15 16]]
    

    4) numpy.vstack((<arr1>,<arr2>...),<axis>)

    • 与numpy.stack()相同,但堆叠方向固定为垂直方向。
    >>>import numpy as np
    >>>n1 = np.arange(0,8).reshape(2,4)
    >>>n2 = np.arange(9,17).reshape(2,4)
    >>>print(n1)
    [[0 1 2 3]
    [4 5 6 7]]
    >>>print(n2)
    [[ 9 10 11 12]
    [13 14 15 16]]
    >>>n3 = np.vstack((n1,n2))
    >>>print(n3)
    [[ 0  1  2  3]
    [ 4  5  6  7]
    [ 9 10 11 12]
    [13 14 15 16]]
    

    8.5 分割数组

    1) numpy.split(<arr>,<indices>,<axis=0>)

    • 将N数组<arr>沿指定轴<axis>分割成<indices>个数组。
    >>>import numpy as np
    >>>n = np.arange(0,8).reshape(2,2,2)
    >>>print(n)
    [[[0 1]
     [2 3]]
    
    [[4 5]
     [6 7]]]
    >>>n1,n2 = np.split(n,2,0)
    >>>print(n1)
    [[[0 1]
     [2 3]]]
    >>>print(n2)
    [[[4 5]
     [6 7]]]
    

    2) numpy.hsplit(<arr>,<indices>)

    • 与numpy.split()相同,但是固定在水平方向分割。
    >>>import numpy as np
    >>>n = np.arange(0,8).reshape(2,2,2)
    >>>print(n)
    [[[0 1]
     [2 3]]
    
    [[4 5]
     [6 7]]]
    >>>n1,n2 = np.hsplit(n,2)
    >>>print(n1)
    [[[0 1]]
    
    [[4 5]]]
    >>>print(n2)
    [[[2 3]]
    
    [[6 7]]]
    

    3) numpy.vsplit(<arr>,<indices>)

    • 与numpy.split()相同,但是固定在垂直方向分割。
    >>>import numpy as np
    >>>n = np.arange(0,8).reshape(2,2,2)
    >>>print(n)
    [[[0 1]
     [2 3]]
    
    [[4 5]
     [6 7]]]
    >>>n1,n2 = np.vsplit(n,2)
    >>>print(n1)
    [[[0 1]
     [2 3]]]
    >>>print(n2)
    [[[4 5]
     [6 7]]]
    

    8.6 元素操作

    1) numpy.resize(<arr>,<shape>)

    • 返回指定形状的新数组。
    >>>import numpy as np
    >>>n1 = np.arange(0,8)
    >>>print(n1)
    [0 1 2 3 4 5 6 7]
    >>>n2 = np.resize(n1,(2,4))
    >>>print(n2)
    [[0 1 2 3]
    [4 5 6 7]]
    

    2) numpy.append(<arr>,<values>,<axis=0>)

    • 在N数组<arr>的尾部增加值<values>。
    • <values>的维度必须与现有数组一致。
    • <axis>操作的轴。
    >>>import numpy as np
    >>>n = np.arange(0,8).reshape(2,4)
    >>>print(n)
    [[0 1 2 3]
    [4 5 6 7]]
    >>>np.append(n,[[9,9,9,9],[9,9,9,9]],1)
    array([[0, 1, 2, 3, 9, 9, 9, 9],
          [4, 5, 6, 7, 9, 9, 9, 9]])
    

    3) numpy.insert(<arr>,<obj>,<values>,<axis=0>)

    • 在N数组<arr>的某个值<obj>前增加值<values>。
    • <values>的维度必须与现有数组一致。
    • <axis>操作的轴。
    >>>import numpy as np
    >>>n = np.arange(0,8).reshape(2,4)
    >>>print(n)
    [[0 1 2 3]
    [4 5 6 7]]
    >>>np.insert(n,1,[[9,9,9,9]],0)
    array([[0, 1, 2, 3],
          [9, 9, 9, 9],
          [4, 5, 6, 7]])
    

    4) numpy.delete(<arr>,<obj>,<axis=0>)

    • 从N数组中沿<axis>轴删除值<obj>。
    >>>import numpy as np
    >>>n = np.arange(0,8).reshape(2,4)
    >>>print(n)
    [[0 1 2 3]
    [4 5 6 7]]
    >>>np.delete(n,1,0)
    array([[0, 1, 2, 3]])
    

    5) numpy.unique(<arr>,<return_index>,<return_inverse>,<return_counts>)

    • N数组去重。
    • <return_index = True> 则返回输入数组的元素下标
    • <return_inverse = True> 则返回去重数组的元素下标
    • <return_counts = True> 则返回元素的去重次数
    >>>import numpy as np
    >>>n = np.asarray([[1,2,3,4,5,6,7],[2,3,4,5,6,7,8],[3,4,5,6,7,8,9]])
    >>>print(n)
    [[1 2 3 4 5 6 7]
    [2 3 4 5 6 7 8]
    [3 4 5 6 7 8 9]]
    >>>np.unique(n,True,True,True)
    (array([1, 2, 3, 4, 5, 6, 7, 8, 9]),
    array([ 0,  1,  2,  3,  4,  5,  6, 13, 20], dtype=int64),
    array([0, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 8],
          dtype=int64),
    array([1, 2, 3, 3, 3, 3, 3, 2, 1], dtype=int64))
    

    8.7 位操作

    • 位操作是指数字的二进制位操作。

    1) numpy.bitwise_and(<arr1>,<arr2)

    • 对两个数组中的数字进行与(and)运算。
    >>>import numpy as np
    >>>n1 = np.arange(1,10)
    >>>print([bin(x) for x in n1])
    ['0b1', '0b10', '0b11', '0b100', '0b101', '0b110', '0b111', '0b1000', '0b1001']
    >>>n2 = np.arange(11,20)
    >>>print([bin(x) for x in n2])
    ['0b1011', '0b1100', '0b1101', '0b1110', '0b1111', '0b10000', '0b10001', '0b10010', '0b10011']
    >>>n3 = np.bitwise_and(n1,n2)
    >>>print([bin(x) for x in n3])
    ['0b1', '0b0', '0b1', '0b100', '0b101', '0b0', '0b1', '0b0', '0b1']
    

    2) numpy.bitwise_or(<arr1>,<arr2>)

    • 对两个数组中的数字进行或(or)运算。
    >>>import numpy as np
    >>>n1 = np.arange(1,10)
    >>>print([bin(x) for x in n1])
    ['0b1', '0b10', '0b11', '0b100', '0b101', '0b110', '0b111', '0b1000', '0b1001']
    >>>n2 = np.arange(11,20)
    >>>print([bin(x) for x in n2])
    ['0b1011', '0b1100', '0b1101', '0b1110', '0b1111', '0b10000', '0b10001', '0b10010', '0b10011']
    >>>n3 = np.bitwise_or(n1,n2)
    >>>print([bin(x) for x in n3])
    ['0b1011', '0b1110', '0b1111', '0b1110', '0b1111', '0b10110', '0b10111', '0b11010', '0b11011']
    

    3) invert(<arr>)

    • 对数组中的数字进行位非操作(!)。
    • 返回补码。
    >>>import numpy as np
    >>>n1 = np.arange(1,10)
    >>>print([np.binary_repr(x) for x in n1])
    ['1', '10', '11', '100', '101', '110', '111', '1000', '1001']
    >>>n2 = np.invert(n1)
    >>>print([np.binary_repr(x) for x in n2])
    ['-10', '-11', '-100', '-101', '-110', '-111', '-1000', '-1001', '-1010']
    

    4)left_shift(<arr>,<n>)

    • 将数组<arr>中的数字左位移<n>个位置,并补0。
    >>>import numpy as np
    >>>n1 = np.arange(1,10)
    >>>print([np.binary_repr(x) for x in n1])
    ['1', '10', '11', '100', '101', '110', '111', '1000', '1001']
    >>>n2 = np.left_shift(n1,2)
    >>>print([np.binary_repr(x) for x in n2])
    ['100', '1000', '1100', '10000', '10100', '11000', '11100', '100000', '100100']
    

    5) right_shift(<arr>,<n>)

    • 将数组<arr>中的数字右位移<n>个位置,并补0。
    >>>import numpy as np
    >>>n1 = np.arange(1,10)
    >>>print([np.binary_repr(x) for x in n1])
    ['1', '10', '11', '100', '101', '110', '111', '1000', '1001']
    >>>n2 = np.right_shift(n1,2)
    >>>print([np.binary_repr(x) for x in n2])
    ['0', '0', '0', '1', '1', '1', '1', '10', '10']
    

    8.8 字符串操作

    1) numpy.char.add(<arr1>,<arr2>)

    • 将两个列表中的字符串拼接。
    >>>import numpy as np
    >>>n1 = np.array(["a","b","c","d"])
    >>>n2 = np.array(["A","B","C","D"])
    >>>n3 = np.char.add(n1,n2)
    >>>print(n3)
    ['aA' 'bB' 'cC' 'dD']
    

    2) numpy.char.multiply(<arr>,<n>)

    • 将列表中的字符串进行<n>重拼接。
    >>>import numpy as np
    >>>n1 = np.array(["a","b","c","d"])
    >>>n2 = np.char.multiply(n1,5)
    >>>print(n2)
    ['aaaaa' 'bbbbb' 'ccccc' 'ddddd']
    

    3) numpy.char.center(<arr>, <width>,<fillchar>)

    • 将数组<arr>统一至 <width>长度并居中。
    • 如果位数不足则用<fillchar>填充。
    >>>import numpy as np
    >>>n1 = np.array(["abcd","abc","ab","a"])
    >>>n2 = np.char.center(n1,3,'#')
    >>>>print(n2)
    ['abc' 'abc' '#ab' '#a#']
    

    4) numpy.char.capitalize(<arr>)

    • 将数组中的字符串首字母大写。
    >>>import numpy as np
    >>>n1 = np.array(["abcd","abc","ab","a"])
    >>>>n2 = np.char.capitalize(n1)
    >>>>print(n2)
    ['Abcd' 'Abc' 'Ab' 'A']
    

    5) numpy.char.capitalize(<arr>)

    • 将数组中的每个首字母大写。
    >>>import numpy as np
    >>>n1 = np.array(["abcd","abc","ab","a"])
    >>>n2 = np.char.title(n1)
    >>>print(n2)
    ['Abcd' 'Abc' 'Ab' 'A']
    

    6) numpy.char.lower(<arr>)

    • 将数组中的所有字母小写。
    >>>import numpy as np
    >>>n1 = np.array(["ABCD","ABC","AB","A"])
    >>>n2 = np.char.lower(n1)
    >>>print(n2)
    ['abcd' 'abc' 'ab' 'a']
    

    7) numpy.char.upper(<arr>)

    • 将数组中的所有字母大写。
    >>>import numpy as np
    >>>n1 = np.array(['abcd' 'abc' 'ab' 'a'])
    >>>n2 = np.char.lower(n1)
    >>>print(n2)
    ["ABCD","ABC","AB","A"]
    

    8) numpy.char.split(<arr>,<sep>)

    • 将数组中的字符串以<sep>分割。
    >>>import numpy as np
    >>>n1 = np.array(["abcd","abc","ab","a"])
    >>>n2 = np.char.split(n1,'b')
    >>>print(n2)
    [list(['a', 'cd']) list(['a', 'c']) list(['a', '']) list(['a'])]
    

    9) numpy.char.splitlines(<arr>)

    • 将数组中的字符串以换行符分割。
    >>>import numpy as np
    >>>n1 = np.array(["Hello\nWorld!","Hello World!","Learn\nPython","Learn Python\n"])
    >>>n2 = np.char.splitlines(n1)
    >>>print(n2)
    [list(['Hello', 'World!']) list(['Hello World!'])
    list(['Learn', 'Python']) list(['Learn Python'])]
    

    10) numpy.char.strip(<arr>,<char>)

    • 移除数组中字符串头或尾的<char>值。
    >>>import numpy as np
    >>>n1 = np.array(["a","ab","ba","abab"])
    >>>n2 = np.char.strip(n1,'a')
    >>>print(n2)
    ['' 'b' 'b' 'bab']
    

    11) numpy.char.join(<char>,<arr>)

    • 将数字中的单个字符串以<char>相连。
    >>>import numpy as np
    >>>n1 = np.array(["a","ab","ba","abab"])
    >>>n2 = np.char.join('-',n1)
    >>>print(n2)
    ['a' 'a-b' 'b-a' 'a-b-a-b']
    

    12) numpy.char.replace(<arr>,<char>,<replace_char)

    • 将数组中字符串的<char>字符替换为<replace_char>。
    >>>import numpy as np
    >>>n1 = np.array(["a","ab","ba","abab"])
    >>>n2 = np.char.replace(n1,'b','z')
    >>>print(n2)
    ['a' 'az' 'za' 'azaz']
    

    13) numpy.char.decode(<arr>,<code>)

    • 将数组中的元素按照<code>解码。
    >>>import numpy as np
    >>>n1 = np.array([b"a",b"b",b"c",b"d",b"e"])
    >>>n2 = np.char.decode(n1,"UTF8")
    >>>print(n2)
    ['a' 'b' 'c' 'd' 'e']
    

    14) numpy.char.encode(<arr>,<code>)

    • 将数组中的元素按照<code>编码。
    >>>import numpy as np
    >>>n1 = np.array(["a","b","c","d","e"])
    >>>n2 = np.char.encode(n1,"UTF8")
    >>>print(n2)
    [b'a' b'b' b'c' b'd' b'e']
    

    8.9 算数函数

    1) numpy.degrees(<radian>)

    • 将弧度转为角度。
    >>>import numpy as np
    >>>angle = np.array([0,30,45,60,90])
    >>>np.degrees(np.sin(angle*np.pi/180))
    array([ 0.        , 28.64788976, 40.51423423, 49.61960059, 57.29577951])
    

    2) 三角函数

    • 计算数组中元素的三角函数值。
    函数 说明
    numpy.sin() 正弦函数
    numpy.cos() 余弦函数
    numpy.tan() 正切函数
    numpy.arcsin() 正弦反三角函数
    numpy.arccos() 余弦反三角函数
    numpy.arctan() 正切反三角函数
    >>>import numpy as np
    >>>angle = np.array([0,30,45,60,90])
    >>>sin = np.sin(angle*np.pi/180)
    >>>print(sin)
    [0.         0.5        0.70710678 0.8660254  1.        ]
    
    >>>cos = np.cos(angle*np.pi/180)
    >>>print(cos)
    [1.00000000e+00 8.66025404e-01 7.07106781e-01 5.00000000e-01
    6.12323400e-17]
    
    >>>tan = np.tan(angle*np.pi/180)
    >>>print(tan)
    [0.00000000e+00 5.77350269e-01 1.00000000e+00 1.73205081e+00
    1.63312394e+16]
    
    >>>arcsin = np.arcsin(sin)
    >>>print(arcsin)
    [0.         0.52359878 0.78539816 1.04719755 1.57079633]
    
    >>>arccos = np.arccos(cos)
    >>>print(arccos)
    [0.         0.52359878 0.78539816 1.04719755 1.57079633]
    
    >>>arctan = np.arctan(tan)
    >>>print(arctan)
    [0.         0.52359878 0.78539816 1.04719755 1.57079633]
    

    3) 舍入函数

    • 处理数组中浮点数元素的小数部分。
    函数 说明
    numpy.around(<a>,<d>) 四舍五入,<d>表示舍入的小数位数。
    numpy.floor(<a>) 向下取整。
    numpy.ceil(<a>) 向上取整。
    >>>import numpy as np
    >>>n = np.array([3.14159,0.22,-1.7,-0.2])
    >>>n1 = np.round(n)
    >>>print(n1)
    [ 3.  0. -2. -0.]
    
    >>>n2 = np.floor(n)
    >>>print(n2)
    [ 3.  0. -2. -1.]
    
    >>>n3 = np.ceil(n)
    >>>print(n3)
    [ 4.  1. -1. -0.]
    

    8.10 算数运算

    1) numpy.add(<arr1>,<arr2>)

    • 将两个数组的元素相加。
    >>>import numpy as np
    >>>n1 = np.arange(1,10)
    >>>n2 = np.arange(1,10)
    >>>n_sum = np.add(n1,n2)
    >>>print(n_sum)
    [ 2  4  6  8 10 12 14 16 18]
    

    2) numpy.subtract(<arr1>,<arr2>)

    • 将两个数组的元素相减。
    >>>import numpy as np
    >>>n1 = np.arange(1,10)
    >>>n2 = np.arange(1,10)
    >>>n_sub = np.subtract(n1,n2)
    >>>print(n_sum)
    [0 0 0 0 0 0 0 0 0]
    

    3) numpy.multiply(<arr1>,<arr2>)

    • 将两个数组的元素相乘。
    >>>import numpy as np
    >>>n1 = np.arange(1,10)
    >>>n2 = np.arange(1,10)
    >>>n_mul = np.multiply(n1,n2)
    >>>print(n_sum)
    [ 1  4  9 16 25 36 49 64 81]
    

    4) numpy.devide(<arr1>,<arr2>)

    • 将两个数组的元素相除。
    >>>import numpy as np
    >>>n1 = np.arange(1,10)
    >>>n2 = np.arange(1,10)
    >>>n_div = np.divide(n1,n2)
    >>>print(n_div)
    [1. 1. 1. 1. 1. 1. 1. 1. 1.]
    

    5) numpy.reciprocal(<arr>)

    • 获得数组中元素的倒数。
    • 元素不能为0。
    >>>import numpy as np
    >>>n = np.array([1/2,0.4,1,2.5,4,-2.5])
    >>>n_rec = np.reciprocal(n)
    >>>print(n_rec)
    [ 2.    2.5   1.    0.4   0.25 -0.4 ]
    

    6) numpy.power(<arr1>,<arr2>)

    • 返回一个新的数组,将N数组<arr1>的元素作为底数,<arr2>中的元素作为幂。
    >>>import numpy as np
    >>>n1 = np.arange(1,10)
    >>>n2 = np.arange(1,10)
    >>>n_pow = np.power(n1,n2)
    >>>print(n_pow)
    [        1         4        27       256      3125     46656    823543
     16777216 387420489]
    

    7) numpy.mod(<arr1>,<arr2>)/numpy.remainder(<arr1>,<arr2>)

    • 返回练个数组中元素想除的余数。
    >>>import numpy as np
    >>>n1 = np.arange(1,11)
    >>>n2 = np.arange(1,20,2)
    >>>n_mod = np.mod(n1,n2)
    >>>print(n_mod)
    [ 0  2  3  4  5  6  7  8  9 10]
    

    8) numpy.real(<arr>)

    • 返回元素中复数所有的实数部分。
    >>>import numpy as np
    >>>n = np.array([6+5j,1+2j,15+4j])
    >>>n_read = np.real(n)
    >>>print(n_read)
    [ 6.  1. 15.]
    

    9) numpy.imag(<arr>)

    • 返回元素中复数所有的虚数部分。
    >>>import numpy as np
    >>>n = np.array([6+5j,1+2j,15+4j])
    >>>n_read = np.imag(n)
    >>>print(n_read)
    [5. 2. 4.]
    

    10) numpy.conj(<arr>)

    • 返回元素中复数通过改变虚部的符号而获得的共轭复数。
    >>>import numpy as np
    >>>n = np.array([6+5j,1+2j,15+4j])
    >>>n_read = np.conj(n)
    >>>print(n_read)
    [ 6.-5.j  1.-2.j 15.-4.j]
    

    11) numpy.angle(<arr>)

    • 返回元素中复数参数的角度。
    >>>import numpy as np
    >>>n = np.angle([6+5j,1+2j,15+4j])
    >>>n_read = np.conj(n)
    >>>print(n_read)
    [0.69473828 1.10714872 0.26060239]
    

    8.11 统计函数

    1) numpy.amin(<arr>,<axis=0>)

    • 返回数组中每个维度的最小值。
    >>>import numpy as np
    >>>n = np.array([[1,3,5],[2,4,6],[7,8,9]])
    >>>print(np.amin(n,1))
    [1 2 7]
    

    2) numpy.amax(<arr>,<axis=0>)

    • 返回数组中每个维度的最大值。
    >>>import numpy as np
    >>>n = np.array([[1,3,5],[2,4,6],[7,8,9]])
    >>>print(np.amax(n,1))
    [5 6 9]
    

    3) numpy.ptp(<arr>,<axis=0>)

    • 返回数组中每个维度的极差。
    >>>import numpy as np
    >>>n = np.array([[1,3,5],[2,4,6],[7,8,9]])
    >>>print(np.ptp(n,0))
    [6 5 4]
    

    4) numpy.percentile(<arr>,<q>,<axis>)

    • 返回数组中每个维度的百分位数(详情见第一篇的分位数部分)。
    • <q>表示所取的百分位数。
    >>>import numpy as np
    >>>n = np.array([[1,3,5],[2,4,6],[7,8,9]])
    >>>print(np.percentile(n,25,0))
    [1.5 3.5 5.5]
    

    5) numpy.median(<arr>,<axis>)

    • 返回数组中每个维度的中位数。
    >>>import numpy as np
    >>>n = np.array([[1,3,5],[2,4,6],[7,8,9]])
    >>>print(np.median(n,1))
    [3. 4. 8.]
    

    6) numpy.mean(<arr>,<axis>)

    • 返回数组中每个维度的算数平均值。
    >>>import numpy as np
    >>>n = np.array([[1,3,9],[2,4,8],[7,8,10]])
    >>>print(np.mean(n,1))
    [4.33333333 4.66666667 8.33333333]
    

    7) numpy.average(<arr>,<axis>)

    • 返回数组中每个维度的加权平均值。
    >>>import numpy as np
    >>>n = np.array([[1,1,3,9],[2,2,4,8],[3,7,8,10]])
    >>>print(np.average(n,1))
    [3.5 4.  7. ]
    

    8) numpy.std(<arr>,<axis>)

    • 返回数组中每个维度的标准差。
    >>>import numpy as np
    >>>n = np.array([[1,1,3,9],[2,2,4,8],[3,7,8,10]])
    >>>print(np.std(n,1))
    [3.27871926 2.44948974 2.54950976]
    

    9) numpy.var(<arr>,<axis>)

    • 返回数组中每个维度的方差。
    >>>import numpy as np
    >>>n = np.array([[1,1,3,9],[2,2,4,8],[3,7,8,10]])
    >>>print(np.var(n,1))
    [10.75  6.    6.5 ]
    

    8.12 排序函数

    1) numpy.sort(<arr>,<axis>,<kind="quicksort">,<order>)

    • 将数组中的元素按某种顺序<kind>排序。
    • <order>表示要排序的字段(如果有的话)。
    • <kind>排序方式包括:
    类型 含义 速度 是否稳定
    quicksort 快速排序 1
    mergesort 归并排序 2
    heapsort 堆排序 3
    >>>import numpy as np
    >>>n = np.array([[1,3,1,9],[8,2,2,4],[3,8,7,10]])
    >>>print(np.sort(n,1,kind="mergesort"))
    [[ 1  1  3  9]
    [ 2  2  4  8]
    [ 3  7  8 10]]
    

    2) numpy.argsort(<arr>,<axis>,<kind="quicksort">,<order>)

    • 与numpy.sort()同样的方式排序,但返回的是元素的索引。
    >>>import numpy as np
    >>>n = np.array([[1,3,1,9],[8,2,2,4],[3,8,7,10]])
    >>>print(np.argsort(n,1,kind="mergesort"))
    [[0 2 1 3]
    [1 2 3 0]
    [0 2 1 3]]
    

    3) numpy.lexsort(<arr1>,<arr2>)

    • 对数组中的元素一一对应排序,并返回元祖列表的索引。
    >>>import numpy as np
    >>>n1 = np.array(['a','B',10])
    >>>n2 = np.array(['A','b',20])
    >>>print(np.lexsort((n1,n2)))
    >>>print([n1[i]  +  ", "  + n2[i]  for i in np.lexsort((n1,n2))])
    [2 0 1]
    ['10, 20', 'a, A', 'B, b']
    

    8.13 搜索函数

    1) numpy.argmin(<arr>,<axis>)

    • 返回数组中的元素的最小值索引。
    >>>import numpy as np
    >>>n = np.array([1,2,3,4,5,6,7,8,9])
    >>>print(np.argmin(n))
    0
    

    2) numpy.argmax(<arr>,<axis>)

    • 返回数组中的元素的最大值索引。
    >>>import numpy as np
    >>>n = np.array([1,2,3,4,5,6,7,8,9])
    >>>print(np.argmax(n))
    8
    

    3) numpy.nonzero(<arr>,<axis>)

    • 返回数组中的元素的非零元素的索引。
    >>>import numpy as np
    >>>n = np.array([1,0,2,3,0,4,5,0,6,7,0,8,9])
    >>>print(np.nonzero(n))
    (array([ 0,  2,  3,  5,  6,  8,  9, 11, 12], dtype=int64),)
    

    4) numpy.where(<condition>)

    • 返回数组中满足给定条件元素的索引。
    >>>import numpy as np
    >>>n = np.array([1,0,2,3,0,4,5,0,6,7,0,8,9])
    >>>print(np.where(n>5))
    (array([ 8,  9, 11, 12], dtype=int64),)
    

    8.14 计数函数

    1) numpy.extract(<arr>,<condition>)

    • 返回数组中满足任何条件元素布尔值的索引。
    >>>import numpy as np
    >>>n = np.array([[1,3,1,9],[8,2,2,4],[3,8,7,10]])
    >>>condition = np.subtract(n,4) > 0
    >>>print(np.extract(n,condition))
    [False False False  True  True False False False False  True  True  True]
    

    8.15 字节交换

    1) numpy.ndarray.byteswap()

    • 交换数组中每个元素字节大端和小端位置。
    >>>import numpy as np
    >>>n1 = np.arange(1,20,2)
    >>>print([np.binary_repr(x) for x in n1])
    ['1', '11', '101', '111', '1001', '1011', '1101', '1111', '10001', '10011']
    >>>n2 = n1.byteswap();
    >>>print([np.binary_repr(x) for x in n2])
    ['1000000000000000000000000', '11000000000000000000000000', '101000000000000000000000000', '111000000000000000000000000', '1001000000000000000000000000', '1011000000000000000000000000', '1101000000000000000000000000', '1111000000000000000000000000', '10001000000000000000000000000', '10011000000000000000000000000']
    

    8.16 N数组的线性代数

    1) numpy.dot(<arr1>,<arr2>)

    • 返回两个数组的点积。
    >>>import numpy as np
    >>>a = np.array([[1,2],[3,4]])
    >>>b = np.array([[5,6],[7,8]])
    >>>print(np.dot(a,b))
    [[19 22]
    [43 50]]
    

    2) numpy.vdot(<arr1>,<arr2>)

    • 返回两个向量的点积。
    >>>import numpy as np
    >>>a = np.array([[1,2],[3,4]])
    >>>b = np.array([[5,6],[7,8]])
    >>>print(np.vdot(a,b))
    70
    

    3) numpy.inner(<arr1>,<arr2>)

    • 返回两个数组的向量内积。
    >>>import numpy as np
    >>>a = np.array([[1,2],[3,4]])
    >>>b = np.array([[5,6],[7,8]])
    >>>print(np.inner(a,b))
    [[17 23]
    [39 53]]
    

    4) numpy.matmul(<arr1>,<arr2>)

    • 返回两个人数组的矩阵乘积。
    >>>import numpy as np
    >>>a = np.array([[1,2],[3,4]])
    >>>b = np.array([[5,6],[7,8]])
    >>>print(np.matmul(a,b))
    [[19 22]
    [43 50]]
    

    5) numpy.linalg.det(<arr>)

    • 返回数组的矩阵行列式值。
    >>>import numpy as np
    >>>n = np.array([[1,2,3],[4,5,6],[7,8,9]])
    >>>print(np.linalg.det(n))
    -9.51619735392994e-16
    

    6) numpy.linalg.solve(<arr>)

    • 返回数组的矩阵线性方程式的解。
    >>>import numpy as np
    >>>a = np.array([[1,2],[3,4]])
    >>>b = np.array([[5,6],[7,8]])
    >>>print(np.linalg.solve(a,b))
    [[-3. -4.]
    [ 4.  5.]]
    

    7) numpy.linalg.inv(<arr>)

    • 返回数组的矩阵的逆。
    >>>import numpy as np
    >>>n = np.array([[1,2,3],[4,5,6],[7,8,9]])
    >>>print(np.linalg.inv(n))
    [[ 3.15251974e+15 -6.30503948e+15  3.15251974e+15]
    [-6.30503948e+15  1.26100790e+16 -6.30503948e+15]
    [ 3.15251974e+15 -6.30503948e+15  3.15251974e+15]]
    
    9. N数组的I/O操作

    1) numpy.save(<filename>,<arr>,<allow_pickles=false>)

    • 将数组保存为.npy文件。
    • 可以通过pickle对数据进行处理。
    >>>import numpy as np
    >>>import os
    >>>n = np.array([[1,2,3],[4,5,6],[7,8,9]])
    >>>np.save("np1",n)
    >>>print([x for x in os.listdir("C:\\Users\\xiaor\\") if x.endswith(".npy")])
    ['np1.npy']
    

    2) numpy.load(<filename>,<allow_pickles=false>)

    • 从.npy文件读取数组。
    • 可以通过pickle对数据进行处理。
    >>>import numpy as np
    >>>n = np.load("np1.npy")
    >>>print(n)
    [[1 2 3]
    [4 5 6]
    [7 8 9]]
    

    3) numpy.savetxt(<filename>,<arr>)

    • 将文件保存为txt文本文件。
    >>>import numpy as np
    >>>import os
    >>>n = np.array([[1,2,3],[4,5,6],[7,8,9]])
    >>>np.savetxt("np1.txt",n)
    >>>print([x for x in os.listdir("C:\\Users\\xiaor\\") if x.endswith("txt")])
    ['np1.txt']
    

    4) numpy.loadtxt(<filename>)

    • 从txt文本文件中读取数组。
    >>>import numpy as np
    >>>n = np.loadtxt("np1.txt")
    >>>print(n)
    [[1. 2. 3.]
    [4. 5. 6.]
    [7. 8. 9.]]
    

    参考资料


    相关文章

      网友评论

        本文标题:大师兄的Python机器学习笔记:Numpy库、Scipy库和M

        本文链接:https://www.haomeiwen.com/subject/anjifhtx.html