numpy中np.array()與np.asarray的區別以及.tolist

PRO_Z發表於2020-06-18

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

相關文章