• numpy中np.array()与np.asarray的区别以及.tolist


      array 和 asarray 都可以将 结构数据 转化为 ndarray,但是主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会。

    1.输入为列表时

    import numpy as np
    
    a=[[1,2,3],[4,5,6],[7,8,9]]
    b=np.array(a)
    c=np.asarray(a)
    a[2]=1
    print(a)
    print(b)
    print(c)
    
    """
    运行结果:
    [[1, 2, 3], [4, 5, 6], 1]
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    """

      从中我们可以看出np.array与np.asarray功能是一样的,都是将输入转为矩阵格式。当输入是列表的时候,更改列表的值并不会影响转化为矩阵的值。

    2.输入为数组时

    import numpy as np
    
    a=np.random.random((3,3))
    print(a.dtype)
    b=np.array(a,dtype='float64')
    c=np.asarray(a,dtype='float64')
    a[2]=2
    print(a)
    print(b)
    print(c)
    
    """
    运行结果:
    float64
    [[0.11294711 0.0957448  0.78717227]
     [0.69908742 0.78219365 0.34341174]
     [2.         2.         2.        ]]
    [[0.11294711 0.0957448  0.78717227]
     [0.69908742 0.78219365 0.34341174]
     [0.82900099 0.68317933 0.99346798]]
    [[0.11294711 0.0957448  0.78717227]
     [0.69908742 0.78219365 0.34341174]
     [2.         2.         2.        ]]
    """

      从上述结果我们可以看出np.array与np.asarray的区别,其在于输入为数组时,np.array是将输入copy过去而np.asarray是将输入cut过去,所以随着输入的改变np.array的输出不变,而np.asarray的输出在变化,

      !!!并且当我们使用np.asarray改变其类型的时候(输入是float64,改为float32),这样当输入改变的时候,np.asarray的输出也不会改变。

    3.array类型转为list类型

    import numpy as np
    
    a=np.random.random((3,3)).round(2)
    print(a.dtype)
    print(a)
    b=a.tolist()
    print("---"*20)
    a[1]=2
    print(a)
    print(b)
    
    """
    运行结果:
    float64
    [[0.29 0.89 0.93]
     [0.83 0.88 0.49]
     [0.21 0.48 0.5 ]]
    ------------------------------------------------------------
    [[0.29 0.89 0.93]
     [2.   2.   2.  ]
     [0.21 0.48 0.5 ]]
    [[0.29, 0.89, 0.93], [0.83, 0.88, 0.49], [0.21, 0.48, 0.5]]
    """

      从上述我们可以看到.tolist是将数组转为list的格式,等同于np.array的反向,那什么情况下需要将np.ndarray转为list的格式呢?当需要序列化的时候(serialization),由于np.ndarray是不可序列化的。

  • 相关阅读:
    Qt 单元测试
    用gcov来检查Qt C++程序的代码覆盖率
    QT .pro文件中的变量说明
    ubuntu 14.04 升级到18.04
    VMware虚拟机中调整Linux分区大小——使用GParted
    JSoup 用法详解
    java内存分配
    Java常量定义需要注意的两点
    java中的容器解释
    JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配
  • 原文地址:https://www.cnblogs.com/nbk-zyc/p/13160622.html
Copyright © 2020-2023  润新知