在JS有一個參數我用 log print 出來長這樣 values = Uint8Array(87818240) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 請問如果我在 django 有一個 3D 陣列 要如何轉換成這個JS格式?
如果你在 Django(Python)中有一個 3D 陣列(例如形狀為 [depth][height][width]
的 numpy
陣列或 list),你想要在前端 JavaScript 中將它變成:
Uint8Array([...])
這裡的關鍵是:
-
將 3D 陣列「攤平成一維(flattened)」
-
轉為
bytes
或 base64(用於傳輸) -
在 JavaScript 中還原為
Uint8Array
✅ 方法一:使用 base64 傳輸
這是最常見且安全的做法:
? Django 端(Python)
import numpy as np import base64 from django.http import JsonResponse def get_array_data(request): # 假設你有一個 3D 的 uint8 numpy 陣列 arr = np.random.randint(0, 256, size=(100, 100, 100), dtype=np.uint8) arr_bytes = arr.tobytes() # 轉成 bytes arr_base64 = base64.b64encode(arr_bytes).decode('utf-8') # 轉成 base64 字串 shape = arr.shape # 用來還原 3D 陣列 return JsonResponse({'data': arr_base64, 'shape': shape})前端 JS
fetch("/your-api-url") .then(res => res.json()) .then(({ data, shape }) => { // base64 decode const binary = atob(data); const len = binary.length; const bytes = new Uint8Array(len); for (let i = 0; i < len; i++) { bytes[i] = binary.charCodeAt(i); } console.log("Flattened Uint8Array:", bytes); // 如果你要還原為 3D 陣列,可用 shape const [D, H, W] = shape; const array3D = []; let idx = 0; for (let d = 0; d < D; d++) { const slice = []; for (let h = 0; h < H; h++) { const row = []; for (let w = 0; w < W; w++) { row.push(bytes[idx++]); } slice.push(row); } array3D.push(slice); } console.log("Restored 3D Array:", array3D); });
方法二:直接傳送一維列表(不建議太大時使用)
若資料不大,也可以 Django 直接回傳 list(缺點:傳輸量大,速度慢)
Django:
import numpy as np from django.http import JsonResponse def get_array_data(request): arr = np.random.randint(0, 256, size=(100, 100, 100), dtype=np.uint8) flat_list = arr.flatten().tolist() return JsonResponse({'data': flat_list})
JS:
fetch("/your-api-url") .then(res => res.json()) .then(({ data }) => { const arr = new Uint8Array(data); console.log(arr); });
總結
方法 | 優點 | 缺點 |
---|---|---|
Base64 傳輸 | 適合大資料、快速、安全 | 前後端需額外解碼 |
直接傳 list | 寫法簡單 | 效率差、資料大會卡死 |
如你這筆資料長度是 87,818,240
(約 83MB),建議用 Base64 壓縮後傳輸,才不會卡爆網頁。
留言板
歡迎留下建議與分享!希望一起交流!感恩!