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是不可序列化的。

posted @ 2020-06-18 22:51  PRO_Z  阅读(1403)  评论(0编辑  收藏  举报