• numpy库


      Numpy简介:    NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。

    1:首次使用numpy之前要导包 import numpy as np ,如果没有下载过numpy库,可以在Linux里面通过pip install numpy来下载

    2:使用numpy创建矩阵

    1.使用np.array()Python list创建

    注意:numpy默认为ndarray的所有元素的类型是相同的

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

    创建一维和二维的数组

    >>> n1=np.array([3,1,4,5])

    >>> n1

    array([3, 1, 4, 5])#一维数组

    >>> n2=np.array([[2,3,4,5],[3,5,6,7]])

    >>> n2

    array([[2, 3, 4, 5],

           [3, 5, 6, 7]])

    >>> #二维数组

    n3=np.array(list('arr'))

    >>> n3

    array(['a', 'r', 'r'], dtype='|S1')

    >>> n4=np.array([1,2.2,'xsxs'])

    >>> n4

    array(['1', '2.2', 'xsxs'], dtype='|S32')

    >>> #int float转换为str

    >>> np.ones(shape = (10,8),dtype= int)

    array([[1, 1, 1, 1, 1, 1, 1, 1],

           [1, 1, 1, 1, 1, 1, 1, 1],

           [1, 1, 1, 1, 1, 1, 1, 1],

           [1, 1, 1, 1, 1, 1, 1, 1],

           [1, 1, 1, 1, 1, 1, 1, 1],

           [1, 1, 1, 1, 1, 1, 1, 1],

           [1, 1, 1, 1, 1, 1, 1, 1],

           [1, 1, 1, 1, 1, 1, 1, 1],

           [1, 1, 1, 1, 1, 1, 1, 1],

           [1, 1, 1, 1, 1, 1, 1, 1]])

    >>> #十行八列的int数组元素值默认为one

    np.zeros([4,4])

    array([[0., 0., 0., 0.],

           [0., 0., 0., 0.],

           [0., 0., 0., 0.],

           [0., 0., 0., 0.]])

    #默认值为零

    np.full((10,10),38)

    array([[38, 38, 38, 38, 38, 38, 38, 38, 38, 38],

           [38, 38, 38, 38, 38, 38, 38, 38, 38, 38],

           [38, 38, 38, 38, 38, 38, 38, 38, 38, 38],

           [38, 38, 38, 38, 38, 38, 38, 38, 38, 38],

           [38, 38, 38, 38, 38, 38, 38, 38, 38, 38],

           [38, 38, 38, 38, 38, 38, 38, 38, 38, 38],

           [38, 38, 38, 38, 38, 38, 38, 38, 38, 38],

           [38, 38, 38, 38, 38, 38, 38, 38, 38, 38],

           [38, 38, 38, 38, 38, 38, 38, 38, 38, 38],

           [38, 38, 38, 38, 38, 38, 38, 38, 38, 38]])#1010列值全为38,可以自己确定维数和值

     np.eye(10)

    array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],

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

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

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

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

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

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

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

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

           [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])

    >>> #对角线全为1,一元十次方程。满秩

    np.arange(0,100,3)

    array([ 0,  3,  6,  9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48,

           51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99])

    #0100之间(左闭右开)以3为步伐

     np.random.randint(0,150,size=5)

    array([ 24, 114,  59, 100,  95])

    >>> #产生50 150的随机数

    >>> np.random.randn(100)

    array([ 3.35082829, -0.37115819,  0.80247094, -1.28873909, -1.28431603,

           -1.11815   ,  0.24174321,  0.45111328, -0.32903064,  1.0352493 ,

           -0.15316301, -0.02536642, -0.56862227,  1.56465411, -1.75109142,

           -0.55242377,  1.89999097,  1.73651904,  0.33510086,  0.50426053,

           -0.34272666,  0.71946504, -0.50232083, -0.56263717, -0.71712574,

           -1.43096495, -2.85686146, -0.63869171, -0.81096476, -0.94847399,

           -0.48270003,  0.16613386,  0.83962232, -0.85022942,  0.024456  ,

            1.99225315,  1.65694911,  0.58285013, -2.29496632, -0.43906447,

           -2.02485793, -0.08674546, -1.07672492, -1.06972989, -0.6505497 ,

           -0.6135854 ,  0.79960243,  1.15791107, -0.54701886,  1.05666947,

            0.14621877, -1.40813635, -0.24591542,  0.19967941, -1.14801003,

            1.8489588 , -0.22480596,  1.47150873, -0.29566871, -0.54097336,

            0.96397258,  1.17292773, -2.37660387, -2.4426527 ,  1.14440024,

           -1.02428763,  0.78537092,  1.41937026,  1.1723089 ,  0.16764803,

            0.14764773, -1.63680993,  0.1469394 ,  0.16930859,  0.61316282,

           -0.20633852,  0.90005043, -0.87075294,  1.34448905,  0.70262954,

            2.05775907, -1.24639371,  1.37833912,  1.13365423,  0.55463811,

            0.24329369, -1.06872399, -0.0792752 , -0.72015879, -0.03266665,

           -0.35233853,  0.89186204, -0.31862884, -0.01163667, -0.0043089 ,

           -0.60102044,  0.64323071,  1.01355728, -0.20745425, -0.38895885])

    >>> 产生100个正太分布的随机数以零为中心

    np.random.normal(loc = 175,scale=10,size=20)

    array([171.00845317, 173.18642661, 179.62602741, 169.97356954,

           183.40271728, 181.23758864, 165.65119933, 186.40289641,

           182.33613485, 182.49041946, 171.20258278, 181.67741833,

           167.81011297, 176.8276235 , 188.37718704, 174.20204526,

           164.05009916, 185.83293973, 160.80993772, 183.45846588])

    产生20个随机数,以175为中心波动系数为10

     np.random.random(size=(5,5,3))

    array([[[0.64123107, 0.15499673, 0.61510688],

            [0.35868677, 0.68369404, 0.00613867],

            [0.13975722, 0.76736526, 0.86223803],

            [0.69251773, 0.63653175, 0.33740486],

            [0.54023603, 0.1246829 , 0.75715704]],

           [[0.81843097, 0.98600987, 0.33229412],

            [0.32300797, 0.87697556, 0.49187322],

            [0.95446863, 0.95139269, 0.16011724],

            [0.12072147, 0.94797314, 0.44881757],

            [0.052932  , 0.79495936, 0.81476853]],

           [[0.84759662, 0.33428409, 0.02649364],

            [0.06872688, 0.0499028 , 0.28084684],

            [0.62091731, 0.23778735, 0.94556048],

            [0.67564929, 0.42806521, 0.73337969],

            [0.01137036, 0.90679013, 0.12479393]],

           [[0.56840726, 0.32098105, 0.48563106],

            [0.34479233, 0.30752574, 0.95330636],

            [0.2945246 , 0.05664123, 0.58739862],

            [0.23435391, 0.41945289, 0.09710961],

            [0.46570456, 0.86916912, 0.39539866]],

           [[0.42793506, 0.13326206, 0.95348895],

            [0.83154412, 0.37675605, 0.75554649],

            [0.4074704 , 0.33219232, 0.44972131],

            [0.75427299, 0.39757514, 0.09302678],

            [0.80792545, 0.51770092, 0.5195222 ]]])

    >>>产生 25个三维01数组

    3:numpy的一些操作

    matplotlib

    import matplotlib.pyplot as plt

    Cat=plt.imread("C:/Users/19575/Desktop/a.jpg")//读取一个图片变成数组ndarray

     plt.imshow(cat)

    <matplotlib.image.AxesImage object at 0x000000000EE88EB8>

    >>> plt.show()//把图片给显示出来

    >>> cat3=cat-20//对图片进行减操作

    >>> plt.imshow(cat3)

    <matplotlib.image.AxesImage object at 0x000000000E7FAF98>

    >>> plt.show()

    >>> n2.shape

    (2L, 4L) #表明是二维四列的数组

    #其实任意一个二维的图片转换成三维数组,长宽最后一维是颜色

    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

    >>> n3=np.arange(0,10,1)

    >>> n3

    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

    >>> n3[::-1]#反方向取数据,间隔为-1

    array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])

    >>>

    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

    n3.reshape(5,2)

    array([[0, 1],

           [2, 3],

           [4, 5],

           [6, 7],

           [8, 9]])

    >>> n3.shape

    (10L,)

    >>> #表明长度为10,变成5*2的形状

    >>> #使用reshape可以对多维数组进行降维,

     #如果reshape(负数),则负数默认为1

    >>>

    >>> n1

    array([53, 41, 55, 32, 79, 81, 91, 34, 72, 68])

    >>> n1.concatence((n1,n1))

    >>> np.concatenate ((n1,n1),axis=0)

    array([53, 41, 55, 32, 79, 81, 91, 34, 72, 68, 53, 41, 55, 32, 79, 81, 91,

           34, 72, 68])

    #级联操作。将两个列表对维度0进行合并

    >>> #变成垂直结构

    >>> n2=np.vstack (n1)

    >>> n2

    array([[53],

           [41],

           [55],

           [32],

           [79],

           [81],

           [91],

           [34],

           [72],

           [68]])

    >>> n3=np.hstack (n2)#变成水平结构

    >>> n3

    array([53, 41, 55, 32, 79, 81, 91, 34, 72, 68])

    >>>

    >>> n3

    array([53, 41, 55, 32, 79, 81, 91, 34, 72, 68])

    >>> np.hstack(np.hstack(p))

    array([ 11, 117, 201, ...,  92, 201, 244], dtype=uint8)

    >>> #使刚才的图片变成了一维

    >>> n4=np.random.randint(0,150,size=(5,7))#声明一个五行七列的数组

    >>> n4

    array([[107, 131, 143,  59,  75, 143, 137],

           [ 87,  71,  45, 146,  29,  92,  64],

           [106, 112,  41, 106, 140,  96,  71],

           [ 18,   0,  40,  77,  44,  96, 125],

           [ 67, 148,  54,  80,  95, 103,  76]])

    >>> np.split(n4,(1,3)axis=0)#在第一行和第三行进行切割,如果axis1的话就是竖直切割

    [array([[107, 131, 143,  59,  75, 143, 137]]), array([[ 87,  71,  45, 146,  29,  92,  64],

           [106, 112,  41, 106, 140,  96,  71]]), array([[ 18,   0,  40,  77,  44,  96, 125],

           [ 67, 148,  54,  80,  95, 103,  76]])]

    >>> pp=np.split(p,(100,200))[0]

    >>> plt.imshow(pp)

    <matplotlib.image.AxesImage object at 0x000000001CEFB7F0>

    >>> pa=plt.imshow(pp)

    >>> plt.show(pa)#把图片在100200之间分割成三份然后展示第0

    >>> 

    >>> np.vsplit (n4,[1,4])

    [array([[107, 131, 143,  59,  75, 143, 137]]), array([[ 87,  71,  45, 146,  29,  92,  64],

           [106, 112,  41, 106, 140,  96,  71],

           [ 18,   0,  40,  77,  44,  96, 125]]), array([[ 67, 148,  54,  80,  95, 103,  76]])]

    >>> #竖直方向切割的是行

    >>> np.hsplit (n4,[0,3])

    [array([], shape=(5L, 0L), dtype=int32), array([[107, 131, 143],

           [ 87,  71,  45],

           [106, 112,  41],

           [ 18,   0,  40],

           [ 67, 148,  54]]), array([[ 59,  75, 143, 137],

           [146,  29,  92,  64],

           [106, 140,  96,  71],

           [ 77,  44,  96, 125],

           [ 80,  95, 103,  76]])]

    >>> #在水平方向切割的是列,第02

    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

    >>> l=[1,2,3,4]

    >>> n=np.array(l)#n变成ndarray

    >>> n[2]=512#修改n[2]

    >>> n2=n

    >>> n2[1]=22

    >>> n2

    array([  1,  22, 512,   4])

    >>> n

    array([  1,  22, 512,   4])

    >>> #当我们的数据是ndarray,如果我们用=赋值,内存没有改变,所以n2n会一起发生变化

    >>> n3=n.copy()#如果是拷贝的话不会一起发生变化

    >>> n3

    array([  1,  22, 512,   4])

    >>> n3[2]=111

    >>> n3

    array([  1,  22, 111,   4])

    >>> n

    array([  1,  22, 512,   4])

    >>>

    ndarray的聚合操作

    1求和np.sum

    >>> p.sum ()

    1098660384

    >>> p.min()

    0

    >>> p.max()

    255

    >>> p.mean ()

    159.82374443571615

    >>> #求平均值

    >>> n=np.random.randint(0,150,size=(3,3))

    >>> n

    array([[ 58,  64,  70],

           [111, 108,  40],

           [124,  23, 115]])

    >>> np.mean (n,axis=0)

    array([97.66666667, 65.        , 75.        ])

    >>> #求每一列的平均值

    >>> np.mean(n,axis=1)

    array([64.        , 86.33333333, 87.33333333])

    >>> #求每一行的平均值

    >>> np.argmax (n)

    6

    >>> #求最大值得索引

    >>> np.argmin (n)

    7

    >>> #求最小值的索引

    >>>

    #可以对整个数组进行加减乘除运算比如,n+2n/2

    4:矩阵乘法

    >>> q1=np.random.randint(0,10,size=(2,2))

    >>> q2=np.random.randint(0,10,size=(2,2))

    >>> q1*q2

    array([[40, 12],

           [12,  0]])

    >>> q1

    array([[5, 2],

           [4, 4]])

    >>> q2

    array([[8, 6],

           [3, 0]])

    >>> np.dot(q1,q2)

    array([[46, 30],

           [44, 24]])

    >>> #矩阵乘法。。。注意不可以直接用乘号,如果直接用乘法符号的话是点乘

    >>> m=np.ones((2,3))

    >>> a=np.arange(3)

    >>> print(m,a)

    (array([[1., 1., 1.],

           [1., 1., 1.]]), array([0, 1, 2]))

    >>> m+a

    array([[1., 2., 3.],

           [1., 2., 3.]])

    >>> #numpy广播机制,维度不对应,自动补全

    >>> #广播机制两条规则:

    >>> #规则一:微缺失的维度补一

    >>> #规则二:假定缺失元素用已有值填充。

    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

    矩阵元素相乘

    >>> two_dim_matrix_one = np.array([[1, 2, 3], [4, 5, 6]])

    >>> two_dim_matrix_two = np.array([[1, 2], [3, 4], [5, 6]])

    >>> two_multi_res = np.dot(two_dim_matrix_one, two_dim_matrix_two)

    >>> two_multi_res

    array([[22, 28],

           [49, 64]])

    >>>

    对应元素相乘

    >>> first=np.array([[1,2,3],[2,3,4]])

    >>> second=np.array([[1,2,3],[3,2,1]])

    >>> first*second

    array([[1, 4, 9],

           [6, 6, 4]])

    >>> np.multiply (first,second)

    array([[1, 4, 9],

           [6, 6, 4]])#点乘

    5:实现排序

    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、实现冒泡排序

    >>> aa=np.array([4,3,2,45,6])

    >>> sort(aa)

    >>> def sort(nd):#冒泡排序

    for i in range(nd.size):

    for j in range(i,nd.size):

    if nd[i]>nd[j]:

    nd[i],nd[j]=nd[j],nd[i]

    return nd

    >>> sort(aa)

    array([ 2,  3,  4,  6, 45])

    >>> #下面是改进的冒泡排序

    >>> def sorted1(nd):#该方法可以降低时间复杂度和空间复杂度

    for i in range(nd.size):

    s=np.argmin(nd[i:])+i#切片所以不对应,要加上i

    print(s)

    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、#快速排序

    np.sortndarray都可以,但有区别

    >>> aaa

    array([ 1,  2, 33, 22, 11])

    >>> aaa.sort()

    >>> aaa

    array([ 1,  2, 11, 22, 33])

    >>> #使用ndarray.sort(),原来的数据改变了,不占内存

    >>> w=np.array([5,3,2,4,2])

    >>> np.sort(w)

    array([2, 2, 3, 4, 5])

    >>> w

    array([5, 3, 2, 4, 2])

    >>> #使用np.sort(),原来的数据没有改变,生成了新的空间占内存

    >>>

    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、部分排序

    np.partition(a,k)

    有的时候我们不对所有的数据感兴趣,我们可能是只对部分数据感兴趣

    1k为正时,我们得到最小的k个数

    2k为负时,我们得到最大的K个数

    >>> nd=np.random.randint (0,150,size=20)

    >>> nd

    array([148,  35, 129,  83, 145,  76, 145,   6,  54, 149,  83,  77, 130,

            21, 106,  27, 127,  70, 119,   9])

    >>> np.partition(nd,-5)#

    array([  6,  54,  27,  21,  35,   9,  70, 129, 119, 127,  83,  77,  76,

            83, 106, 130, 145, 145, 148, 149])#得到5个最大的数,但不一定排序好

    >>> np.partition(nd,5)

    array([  6,   9,  21,  27,  35,  54,  70, 145,  76, 145,  83,  77, 130,

            83, 106, 129, 127, 119, 148, 149])#得到5个最小的数,但不一定排序好

     6:对图片的一些操作

    >>> fish=plt.imread('C:\Users\19575\Desktop\a.jpg')

    >>> plt.imshow(fish)

    <matplotlib.image.AxesImage object at 0x000000000EF23358>

    >>> plt.show()

    >>> fish1=fish[::-1]

    >>> plt.show()

    >>> plt.imshow(fish1)

    <matplotlib.image.AxesImage object at 0x000000000F432470>

    >>> plt.show()

    >>> #实现上下颠倒

    >>> fish2=fish[::-1,::-1]#上下颠倒,又左右颠倒

    >>> plt.imshow(fish2)

    <matplotlib.image.AxesImage object at 0x000000001C2CF4E0>

    >>> plt.show()

    >>> fish3=fish[::,::,::-1]#对颜色颠倒,红变蓝,。。等

    >>> plt.imshow(fish3)

    <matplotlib.image.AxesImage object at 0x000000001C834E10>

    >>> plt.show()

    >>> fish5=fish[::5,::5]#每隔五个数据取一个数据

    >>> plt.imshow(fish5)

    <matplotlib.image.AxesImage object at 0x000000001CB59B38>

    >>> plt.show()

    >>> #图形变得模糊

    >>> 

    7总结:numpy是一个用python实现的科学计算包。包括:1、一个强大的N维数组对象Array;2、比较成熟的(广播)函数库;3、用于整合C/C++和Fortran代码的工具包;4、实用的线性代数、傅里叶变换和随机数生成函数。numpy和稀疏矩阵运算包scipy配合使用更加方便,总之这个随笔是numpy基础的总结,之后我还会继续写一些numpy方面的应用的随笔。

  • 相关阅读:
    c/c++ const
    Lucene2.9.1使用小结(同样适用于Lucene 3.0 )
    java 对properties 文件的写操作
    oracle 建表序列插入值
    jxl 读取2003 excel 示例
    HttpClient 的使用
    小故事
    iText 导出word 经典实现
    使用dom4j 解析xml
    lucene 在项目中的使用
  • 原文地址:https://www.cnblogs.com/henuliulei/p/9359212.html
Copyright © 2020-2023  润新知