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