zoukankan      html  css  js  c++  java
  • numpy使用总结

    一、numpy简介

    NumPy 是一个 Python 包, 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库,支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。Numpy内部解除了Python的PIL(全局解释器锁),运算效率极好,是大量机器学习框架的基础库。

    二、使用numpy创建数组

    首先导入numpy

    import numpy as np
    

    1、使用np.array方法创建数组

    a = np.array([1, 2, 3])    #一维数组
    b = np.array([[1, 2, 3], [4, 5, 6]])    #二维数组
    
    print a
    print b
    

    输出:

    [1 2 3]
    [[1 2 3]
     [4 5 6]]
    

    也可以直接将python列表或元组转换成numpy数组

    a = [1, 2, 3, 4]
    b = np.array(a)
    
    print b
    

    输出:

    [1 2 3 4]
    

    还可以使用np.zeros([m, n])或者np.ones([m, n])来创建值全为0或者全为1的m行n列的数组。

    a = np.zeros([3, 4])
    print a
    

    输出:

    [[0. 0. 0. 0.]
     [0. 0. 0. 0.]
     [0. 0. 0. 0.]]
    
    b = np.ones([3, 4])
    print b
    

    输出:

    [[1. 1. 1. 1.]
     [1. 1. 1. 1.]
     [1. 1. 1. 1.]]
    

    可以看到上面的输出默认为float,若想得到int的输出,只要指定dtype参数为int即可

    b = np.ones([3, 4], dtype=int)
    print b
    

    输出:

    [[1 1 1 1]
     [1 1 1 1]
     [1 1 1 1]]
    

    这样产生的是一个二维数组,有时候我们想要一维的初始化数组,使用以下方法即可:

    b = np.ones([3, 4], dtype=int).flatten()
    print b
    

    输出:

    [1 1 1 1 1 1 1 1 1 1 1 1]
    

    除了使用np.array方法创建数组外,还可以使用np.asarray方法。两者的区别表现在当复制数组时,array方法为深复制,而asarray方法为浅复制。

    a = np.zeros([3, 4])
    b = np.array(a)
    c = np.asarray(a)
    d = a
    
    a[0] = 1
    print a
    print '
    '
    print b
    print '
    '
    print c
    print '
    '
    print d
    

    输出:

    [[1. 1. 1. 1.]
     [0. 0. 0. 0.]
     [0. 0. 0. 0.]]
    
    
    [[0. 0. 0. 0.]
     [0. 0. 0. 0.]
     [0. 0. 0. 0.]]
    
    
    [[1. 1. 1. 1.]
     [0. 0. 0. 0.]
     [0. 0. 0. 0.]]
    
    
    [[1. 1. 1. 1.]
     [0. 0. 0. 0.]
     [0. 0. 0. 0.]]
    

    2、使用np.arange方法创建数组

    np.arange(start, stop, step, dtype)方法可以接收4个参数:start为数组范围的起始值,默认为0;stop为范围结束值的下一个值,也就是数组范围为[start, stop);step为产生数组的步长,默认为1;dtype为产生的数据类型。

    a = np.arange(5)  #只提供终止值
    print a
    

    输出:

    [0 1 2 3 4]
    
    a = np.arange(1, 10, 2)  #提供起始值、终止值和步长
    print a
    

    输出:

    [1 3 5 7 9]
    

    3、使用np.linspace方法创建数组

    np.linspace(start, stop, num, endpoint, retstep, dtype)可以接收5个参数:start和stop与np.arange相同;endpoint表示数据范围是否包括stop,若endpoint为true,则数据范围为[start, stop],否则为[start, stop),endpoint默认为true;num则表示在指定的数据范围内均匀地产生num个数,dtype指定了产生的数据类型。

    a = np.linspace(1, 10, 5)  #在[1, 10]之间均匀地产生5个数
    print a
    

    输出:

    [ 1.    3.25  5.5   7.75 10.  ]
    
    a = np.linspace(1, 10, 5, endpoint=False)  #在[1, 9]之间均匀地产生5个数
    print a
    

    输出:

    [1.  2.8 4.6 6.4 8.2]
    

    三、numpy基本操作

    1、获取数组中的元素个数

    import numpy as np
    
    a = np.array([1, 2, 3])    #一维数组
    b = np.array([[1, 2, 3], [4, 5, 6]])    #二维数组
    
    print a.size
    print b.size
    

    输出:

    3
    6
    

    2、获取数组形状(几行几列, 一维数组返回列数)

    a = np.array([1, 2, 3])    #一维数组
    b = np.array([[1, 2, 3], [4, 5, 6]])    #二维数组
    
    print a.shape
    print b.shape
    

    输出:

    (3L,)
    (2L, 3L)
    

    还可以用reshape函数调整数组形状

    b = np.array([[1, 2, 3], [4, 5, 6]])
    c = b.reshape(3, 2)
    print c
    

    输出

    [[1 2]
     [3 4]
     [5 6]]
    

    b通过reshape产生了一个3行2列的数组c.

    3、获取数组维度

    a = np.array([1, 2, 3])    #一维数组
    b = np.array([[1, 2, 3], [4, 5, 6]])    #二维数组
    
    print a.ndim
    print b.ndim
    

    输出:

    1
    2
    

    四、numpy数组切片

    numpy数组的切片与python列表切片类似,a[m:n]表示取下标在[m, n)之间的数据,a[m:]表示从下标m开始一直取到数组a的最后一个数据,a[:n]表示取下标在[0, n)之间的数据,a[:]表示数组a。
    一维数组切片:

    a = np.array([1, 2, 3, 4, 5])
    b = a[1:4]
    print b
    c = a[1:]
    print c
    d = a[:3]
    print d
    e = a[:]
    print e
    

    输出:

    [2 3 4]        #b
    [2 3 4 5]     #c
    [1 2 3]        #d
    [1 2 3 4 5]  #e
    

    二维数组切片:

    a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    print a
    b = a[1:2, 1:2]
    print b
    c = a[1:, :1]
    print c
    d = a[:, :]
    print d
    

    输出:

    [[1 2 3]    #a
     [4 5 6]
     [7 8 9]]
    [[5]]         #b
    [[4]          #c
     [7]]
    [[1 2 3]    #d
     [4 5 6]
     [7 8 9]]
    

    可以看到二维数组的切片分成了两个部分,用逗号分隔,第一部分表示行的范围,第二部分表示列的范围。

    五、np.random的使用

    1、使用np.random.rand(m, n)创建m行n列的数组,数组值范围为[0,1),不提供m和n则只产生一个随机数。

    a = np.random.rand(5, 5)
    print a
    

    输出:

    [[0.58217643 0.64383117 0.76970558 0.19093121 0.55160547]
     [0.17104143 0.37784287 0.54680743 0.02004874 0.7704732 ]
     [0.44994954 0.49856079 0.31035112 0.97869974 0.94965246]
     [0.22002432 0.18942185 0.82604923 0.90411721 0.21349957]
     [0.55091737 0.74666898 0.62638943 0.20161895 0.8862976 ]]
    

    2、使用np.random.normal(loc=0.0, scale=1.0, size=None)来创建高斯分布的随机数,loc为均值,scale为标准差,size为创建的数组大小。

    a = np.random.normal(0, 1, (3, 3))
    print a
    

    输出:

    [[ 0.45019676 -2.03182249 -1.63827994]
     [-1.24037828  0.86693021 -1.42478489]
     [ 1.39990274 -0.6936522   1.6802083 ]]
    

    3、使用numpy.random.randint(low, high=None, size=None, dtype='l')来产生指定范围内的整数,范围为[low, high),如果没有指定high,则范围为[0, low)。

    a = np.random.randint(10, size=(3, 3))
    print a
    b = np.random.randint(5, 10, size=(3, 3))
    print b
    

    输出:

    [[1 2 1]
     [2 5 9]
     [2 3 1]]
    [[7 7 8]
     [5 6 5]
     [7 7 9]]
    

    4、使用np.random.shuffle打乱数组

    a = np.arange(10)
    print a
    np.random.shuffle(a)
    print a
    

    输出:

    [0 1 2 3 4 5 6 7 8 9]
    [4 7 9 6 8 2 5 3 1 0]
    
    a = np.arange(9).reshape(3, 3)
    print a
    np.random.shuffle(a)
    print a
    

    输出:

    [[0 1 2]
     [3 4 5]
     [6 7 8]]
    [[3 4 5]
     [0 1 2]
     [6 7 8]]
    

    5、使用numpy.random.choice(a, size=None, replace=True, p=None)对数组进行随机抽样,如果a是一个数组,则从a中抽取元素,若a是一个int值,则从np.arange(a)中抽取元素;size为抽取的元素形状,若为(m, n)则抽取m*n个元素,排成m行n列;当replace为False时,生成的随机数不能有重复的值;p代表了数组a中每个元素被抽取的概率,默认是从所有元素中随机抽取。

    a = np.arange(5)
    print a
    b = np.random.choice(a, size=3, replace=False) # 从a中随机抽取3个数,不允许重复
    print b
    c = np.random.choice(a, size=10, p=(0.5, 0.1, 0.1, 0.1, 0.2)) # 从a中抽取10个数,[0 1 2 3 4]被抽取的概率分别为(0.5, 0.1, 0.1, 0.1, 0.2)
    print c
    
    [0 1 2 3 4]
    [4 2 1]
    [0 0 0 0 1 0 0 0 4 0]
    

    六、numpy搜索和替换

    1、条件计算

    可以使用np.where函数找出数组a中元素值大于5的下表

    a = np.arange(9).reshape(3, 3)
    print a
    b = np.where(a>5)
    print b
    

    输出:

    [[0 1 2]
     [3 4 5]
     [6 7 8]]
    (array([2, 2, 2], dtype=int64), array([0, 1, 2], dtype=int64))
    

    将结果的第一个数组与第二个数据结合就可以得到值大于5的元素下标:[2, 0], [2, 1], [2, 2]。

    2、替换

    可以使用以下方法将数组中大于5的值替换为-1。

    a = np.arange(9).reshape(3, 3)
    print a
    a[a>5] = -1
    print a
    

    输出:

    [[0 1 2]
     [3 4 5]
     [6 7 8]]
    [[ 0  1  2]
     [ 3  4  5]
     [-1 -1 -1]]
    

    七、numpy统计函数

    1、最大值与最小值

    使用np.amax()和np.amin()来求数组中指定轴的最大值和最小值,在二维数组中,axis=0表示列,axie=1表示行。未指定轴则取数组内全部元素的最大值和最小值。

    a = np.arange(9).reshape(3, 3)
    print a
    print np.amax(a)
    print np.amin(a)
    cmax = np.amax(a, axis=0) #列的最大值
    rmin = np.amin(a, axis=1) #行的最小值
    print cmax
    print rmin
    

    输出:

    [[0 1 2]
     [3 4 5]
     [6 7 8]]
    8
    0
    [6 7 8]
    [0 3 6]
    

    2、算数平均值

    使用np.mean()求数组中指定轴的平均值,在二维数组中,axis=0表示列,axie=1表示行。未指定轴则对数组内全部元素取平均值。

    a = np.arange(9).reshape(3, 3)
    print a
    cmean = np.mean(a, axis=0) #列的平均值
    rmean = np.mean(a, axis=1) #行的平均值
    print a_max
    print a_min
    

    输出:

    [[0 1 2]
     [3 4 5]
     [6 7 8]]
    [3. 4. 5.]
    [1. 4. 7.]
    

    3、加权平均值

    np.average()用来计算加权平均值,也可以计算指定轴的加权平均值。

    a = np.array([1, 2, 3]) 
    print a
    print np.average(a)
    avg = np.average(a, weights=[6, 6, 6])
    print avg
    

    输出:

    [1 2 3]
    2.0
    2.0
    

    当未指定权重和轴时,np.average对数组中所有元素求平均值,当指定权重时,np.average求数组的加权平均值,上面的例子中,avg=(16+26+3*6)/(6+6+6)=2.0

    4、方差

    使用np.var()来计算方差,可通过axis参数指定轴。

    a = np.arange(9).reshape(3, 3)
    print a
    print np.var(a)
    cvar = np.var(a, axis=0) #列的方差
    rvar = np.var(a, axis=1) #行的方差
    print cvar
    print rvar
    

    输出:

    [[0 1 2]
     [3 4 5]
     [6 7 8]]
    6.666666666666667
    [6. 6. 6.]
    [0.66666667 0.66666667 0.66666667]
    

    5、标准差

    使用np.std()来计算标准差,如果没有指定轴,则在数组全部的值中计算。标准差是方差的平方根。

    a = np.arange(9).reshape(3, 3)
    print a
    print np.std(a)
    cstd = np.std(a, axis=0) #列的标准差
    rstd = np.std(a, axis=1) #行的标准差
    print cstd
    print rstd
    

    输出:

    [[0 1 2]
     [3 4 5]
     [6 7 8]]
    2.581988897471611
    [2.44948974 2.44948974 2.44948974]
    [0.81649658 0.81649658 0.81649658]
    

    6、中位数

    使用np.median()求中位数,可通过axis参数指定轴。

    a = np.arange(9).reshape(3, 3)
    print a
    print np.median(a)
    cmdn = np.median(a, axis=0) #列的中位数
    rmdn = np.median(a, axis=1) #行的中位数
    print cmdn
    print rmdn
    

    输出:

    [[0 1 2]
     [3 4 5]
     [6 7 8]]
    4.0
    [3. 4. 5.]
    [1. 4. 7.]
    

    八、numpy线性代数

    1、数组点积

    可以使用np.dot(a, b)方法来求两个数组的点积。对于二维数组,其等效于矩阵乘法。 对于一维数组,它是向量的内积。 对于 N 维数组,它是a的最后一个轴上的和与b的倒数第二个轴的乘积。

    a = np.array([[1, 2], [3, 4]])
    b = np.array([[5, 6], [7, 8]])
    print np.dot(a, b)
    c = np.array([1, 2, 3])
    d = np.array([4, 5, 6])
    print np.dot(c, d)
    

    输出:

    [[19 22]
     [43 50]]
    32
    

    2、向量点积

    可以使用np.vdot(a, b)来计算两个向量的点积。当两个向量均为一维向量时,vdot和dot没有区别。vdot和dot的区别主要有以下两点:
    ① 当np.vdot(a, b)的第一个参数为复数时,则使用a的共轭复数参与运算;
    ②当np.vdot(a, b)中的a, b为多维向量时,则将a,b都变为一维向量后运算。

    a = np.array([[1, 2], [3, 4]])
    b = np.array([[5, 6], [7, 8]])
    print np.dot(a, b)
    print np.vdot(a, b)
    c = np.array([1, 2, 3])
    d = np.array([4, 5, 6])
    print np.dot(c, d)
    print np.vdot(c, d)
    print np.dot([2j, 3j], [2j, 3j])
    print np.vdot([2j, 3j], [2j, 3j])
    

    输出:

    [[19 22]
     [43 50]]
    70
    32
    32
    (-13+0j)
    (13+0j)
    

    3、行列式的值

    numpy.linalg.det()被用来求行列式的值。 对于 2×2 矩阵,它是左上和右下元素的乘积与其他两个的乘积的差。换句话说,对于矩阵[[a,b],[c,d]],行列式计算为ad-bc。

    a = np.array([[1, 2], [3, 4]])
    print a
    print np.linalg.det(a)
    b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    print b
    print np.linalg.det(b)
    

    输出:

    [[1 2]
     [3 4]]
    -2.0000000000000004
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    -9.51619735392994e-16
    

    4、矩阵的逆

    使用numpy.linalg.inv()函数来计算矩阵的逆。 矩阵的逆是这样的,如果它乘以原始矩阵,则得到单位矩阵。

    a = np.array([[1, 2], [3, 4]])
    print a
    b = np.linalg.inv(a)
    print b
    print np.dot(a, b)
    

    输出:

    [[1 2]
     [3 4]]
    [[-2.   1. ]
     [ 1.5 -0.5]]
    [[1.00000000e+00 1.11022302e-16]
     [0.00000000e+00 1.00000000e+00]]
    

    5、特征向量

    可以使用np.linalg.eig(a)来求矩阵a的特征向量。

    a = np.array([[1, 2], [3, 4]])
    print a
    eig1, eig2 = np.linalg.eig(a)
    print eig2
    

    输出:

    [[1 2]
     [3 4]]
    [[-0.82456484 -0.41597356]
     [ 0.56576746 -0.90937671]]
    

    6、矩阵拼接

    可以使用np.vstack((a, b))和np.hstack((a, b))来垂直拼接和水平拼接两个矩阵。

    a = np.arange(9).reshape(3, 3)
    b = np.arange(9).reshape(3, 3)
    print a
    print b
    print np.vstack((a, b))
    print np.hstack((a, b))
    

    输出:

    [[0 1 2]
     [3 4 5]
     [6 7 8]]
    [[0 1 2]
     [3 4 5]
     [6 7 8]]
    [[0 1 2]
     [3 4 5]
     [6 7 8]
     [0 1 2]
     [3 4 5]
     [6 7 8]]
    [[0 1 2 0 1 2]
     [3 4 5 3 4 5]
     [6 7 8 6 7 8]]
    

    九、读取文件

    1、使用np.genfromtxt()或者np.loadtxt()读取文件

    在D盘根目录创建一个名为text.txt的文件,内容如下

    可以使用np.genformtxt()读取文件

    a = np.genfromtxt('D:\test.txt', delimiter=',')
    print a
    

    输出:

    [[1. 2. 3.]
     [4. 5. 6.]]
    

    假如文件中有汉字的字段,则需要指定读取的类型dtype=np.str读取,将test.txt改为如下(utf8格式保存):

    读取数据:

    a = np.loadtxt('D:\test.txt',dtype=np.str, delimiter=',', encoding='utf8')
    print a
    a = a[:, 1:].astype(np.int) #使用切片得到要处理的数据并转换为int
    print a
    

    输出:

    [['xefxbbxbfxe5xbcxa0xe4xb8x89' '1' '2' '3']
     ['xe6x9dx8exe5x9bx9b' '4' '5' '6']]
    [[1 2 3]
     [4 5 6]]
    

    此外,使用结构数组也能读入这样的文件,并且可以使用不同的元素类型保存每个列的值:

    persontype = np.dtype({                                  #自定义类型
        'names':['name', 'age', 'weight', 'height'],
        'formats':['S32','i', 'f', 'f']})                             #指定每一列的类型
    a = np.loadtxt('D:\test.txt',dtype=persontype, delimiter=',', encoding='utf8')
    print a
    

    输出:

    [('xefxbbxbfxe5xbcxa0xe4xb8x89', 1, 2., 3.)
     ('xe6x9dx8exe5x9bx9b', 4, 5., 6.)]
    

    2、使用np.savetxt()保存文件

    a = np.arange(9).reshape(3, 3)
    np.savetxt("D:output.txt", a)    #浮点数保存,空格分隔
    np.savetxt("D:output.txt", a, fmt='%d', delimiter=',')   #整数保存,逗号分隔
    

    十、参考

    1、https://www.jianshu.com/p/83c8ef18a1e8
    2、https://www.yiibai.com/numpy
    3、https://www.cnblogs.com/laumians-notes/p/8288638.html

  • 相关阅读:
    纪伯伦:我曾七次鄙视我的灵魂
    字典和集合
    元组
    列表
    字符串
    数值类型
    内置函数了解一下
    了解Python
    centos7安装mysql数据库
    xenserver 上传centos6.8镜像
  • 原文地址:https://www.cnblogs.com/sench/p/9402342.html
Copyright © 2011-2022 走看看