logo
Loading...

如何利用 list(...) 實現 a.tolist() 的效果?? - Cupoy

請問這題的解題邏輯為何?非常感謝。

如何利用 list(...) 實現 a.tolist() 的效果??

2021/03/27 下午 04:43
Numpy 陣列的定義與屬性
張恩若
觀看數:489
回答數:2
收藏數:1

請問這題的解題邏輯為何?非常感謝。

回答列表

  • 2021/03/30 下午 03:08
    張維元 (WeiYuan)
    贊同數:0
    不贊同數:0
    留言數:0

    嗨,你好
    感謝你提出這個問題,這題的背景是因為 list(...) 只能做一層的轉換,當 array 是多層的時候就是失敗。因此想要模仿出 .tolist() 的效果就必須每一層都執行 list(...) 直到最底層為止。更多細節可以參考另外一篇討論:[新作業的解答第三題,想請教迴圈程式碼的部分](https://www.cupoy.com/qa/collection/00000174C4BC1B93000000016375706F795F70726572656C656173654355/000001783E1ECD55000000076375706F795F72656C656173654349/0000017868F0FD630000001E6375706F795F72656C656173655155455354)。

    嗨,你好,我是維元,持續在不同的平台發表對 #資料科學、 #網頁開發 或 #軟體職涯 相關的文章。如果對於內文有疑問都歡迎與我們進一步的交流,都可以追蹤 我的粉絲專頁 ヽ(●´∀`●)ノ

  • 2021/03/30 下午 04:31
    Jaio
    贊同數:0
    不贊同數:0
    留言數:0

    首先,先來理解 list 與 .tolist() 的差異。 numpy 中的 ndarray.tolist() 這個方法可以把一個 n 層的 array 轉為一個 list, 並把裡面的數字從 numpy dtype (numpy.int32/numpy.float64/...) 轉為標準的 type (int/float/...)。 而 list 只能把 array 中一個一個拿出來收集起來,所以拿出來收集的東西是**少一層的 array** 而且**並不會把裡面數字的型態轉為標準的型態**。 所以現在我們如果想用 list 做到 np.tolist() 的功能,必須克服兩個問題。 第一 : 如何將數字型態從numpy的型態轉為標準的型態? 第二 : 如何將 array 中的數據轉為 list 後,在全部收集起來。 (所以看出來了嗎,如果是一維的陣列,這個問題不必解決) 我們用例子解決上述問題。 ```python # 以下 b_list 為用 list 轉出來的 ,b_tolist 為用 tolist() 轉出來的,我們會比較他們裡面的 1.元素型態 與 2. 長相一不一樣。 import numpy as np # 一層的陣列 a = np.array([1,2,3]) a >>>array([1, 2, 3]) b_tolist = a.tolist() b_tolist >>> [1, 2, 3] b_list = [] list(b_list.append(i.item()) for i in a) # 我們用 item() 把 numpy 型態轉為標準型態 b_list == b_tolist >>> True type(b_list[0]) == type(b_tolist[0]) == int >>> True # 兩層陣列以上,我們以三層作為例子 a = np.array([[[1.0,2,3],[4,5,6],[7,8,9]],[[1,2,3],[4,5,6],[7,8,9]]]) a >>> array([[[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]], [[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]]]) a.shape >>> (2, 3, 3) b_tolist = a.tolist() b_tolist >>> [[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]], [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]] # 我們先挑第一個問題解決也就是先把每一個元素轉好型態後,再把他們一層一層加到 list 中 z = [] x = [] b_list = [] for i in range(len(a)): # print('i:%s'%i) # print(a[i]) for j in range(len(a[i])): # print('j:%s'%j) # print(a[i][j]) for k in range(len(a[i][j])): # print('k:%s'%k) # print(a[i][j][k]) x.append(a[i][j][k].item()) z.append(x) x = [] b_list.append(z) z=[] b_list == b_tolist >>> True type(b_list[0][0][0]) == type(b_tolist[0][0][0]) == float >>> True ``` 總結以上,當有 n 層 np.array 我們則需要 n 個空 list 去存放我們以用 list 轉好的數組,程式碼參考如上,以上是我解這題的邏輯,你可以參考看看~ tolist() 在 numpy 的官方文件(參照下列網址) https://numpy.org/doc/stable/reference/generated/numpy.ndarray.tolist.html