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