zoukankan      html  css  js  c++  java
  • Numpy库的学习(五)

    今天继续学习一下Numpy库,废话不多说,整起走

    先说下Numpy中,经常会犯错的地方,就是数据的复制

    这个问题不仅仅是在numpy中有,其他地方也同样会出现

    import numpy as np
    a = np.arange(12)
    b = a
    print(b is a)
    b.shape = 3,4
    print(a.shape)
    print(id(a))
    print(id(b))

    先看看这段代码,我们随便建立了一个numpy数组

    然后我想把a这个值,赋值给b,很简单的操作,b = a 

    那么我们打印一下b和a是不相等,返回的结果为True

    也就是说,b和a是相等的

    那么我们现在讲b做个shape变换

    然后在看看a的shape有没有变换

    我们这里多打印些东西,更容易我们理解

    我们看到a 的id,和b 的id 是一样的,说明a和b,是完全相等的

    我改变其中任意一个,都是改变另外一个值。实际上a和b指向的都是内存中的同一个地址

    我们接着看下面的代码

    c = a.view()
    print(c is a)
    c.shape = 2,6
    print(a.shape)
    c[0,4] = 1234
    print(a)
    print(id(a))
    print(id(c))

    我这里 定义了一个c,这个c也是一种复制,浅复制。用view()

    我们在看看c 是不是a,返回的结果则是,False,说明,a和c不相等

    我们将c.shape变换为2,6

    打印一下a.shape发现,a的shape还是3,4

    那么我将c中的一个值,修改为1234

    可以看到,打印出来的a也改变了

    让后通过id发现, 他们两个不是同一个地址。但是我修改的时候会做修改

    说明,用view()方法复制出来的数据,相当于python中的浅拷贝。

    简单说,就是a和c他们指向的地址不一样,但是他们公用一组数据。

    但是这个view不推荐使用

    下面我们接着看

    d = a.copy()
    print(d is a) 
    d[0,0] = 9999
    print(d)
    print(a)

    这里看到,d = a.copy(),a 不是d ,所以打印出来是False

    那么我们让d 中的 一个元素变成9999

    那么打印一下a和d 发现,a中没有变化,d中有变化,也就是说

    如果我们想让一个变量,的初始值是a,然后在新的上面做一些变化的时候,一定要用copy来做

    下面我们在说说argmax

    data = np.sin(np.arange(20).reshape(5,4))
    print(data)
    ind = data.argmax(axis=0)
    print(ind)
    data_max = data[ind, range(data.shape[1])]
    print(data_max)

    这段代码可以看出,我们生成了一个5行 4列的矩阵。我们定义维度axis = 0 就是按照列进行选择

    打印一下可以看到,第一列中0.98935825这个值是最大的。我们通过打印ind,得到最大的值是矩阵第一列的第3个元素

    也就是元素下标为2,那么第二列中,第一个元素最大,下标为0,以此类推,得到[2 0 3 1]

    按行找的话,需要设置维度axis = 1,即可

    我们想取到,没列中,最大的数是多少,可以使用data_max这种取值方式,将矩阵中按照列排列最大的元素是多少,取出来

    a = np.arange(0,40,10)
    print(a)
    b = np.tile(a,(4,2))
    print(b)=

    看到上面这段代码,我们生成一个向量

    然后,通过tile函数,将我们生成的向量传入进去,让后按照矩阵进行翻倍变换

    得到,4行2列的数据,下面继续

    a = np.array([[4,3,5],[1,2,1]])
    print(a)
    b = np.sort(a, axis = 1)
    print(b)
    a.sort(axis = 1)
    print('****************')
    print(a)
    a = np.array([4,3,1,2])
    j = np.argsort(a)
    print('***************')
    print(j)
    print('***************')
    print(a[j])

    首先我们使用sort,将我们的a进行了以行为主的排序

    我们可以看到,使用np.sort和直接.sort的效果是一样的

    np.argsort,则是求出a的索引值,然后再按照a的索引值进行排序

    今天就先说到这里,感谢各位的阅读,感谢支持!!谢谢!!

  • 相关阅读:
    AtCoder Grand Contest 029C
    AtCoder Grand Contest 034D
    JZOJ 4418. 【HNOI2016模拟4.1】Prime的把妹计划(单调栈+线段树)
    COCI 2015/2016 PROKLETNIK(单调栈+线段树)
    常用数论定理(费马小定理&欧拉定理&扩展欧拉定理)
    JZOJ 3252. 【GDOI三校联考】炸弹(树形DP)
    prufer序列入门
    NOI2020全国统一省选-GDOI游记(爆炸记)
    Manacher算法操作详解
    JZOJ 6493. 【GDOI2020模拟03.04】迷宫(状压DP)
  • 原文地址:https://www.cnblogs.com/ws17345067708/p/10714169.html
Copyright © 2011-2022 走看看