簡體   English   中英

如何將 vstack 代碼轉換為 for-loop (Python)?

[英]How to convert vstack code to for-loop (Python)?

我目前有一個列表(list_arr),其中包含 8 個 numpy arrays 大小如下:

0. (6300, 6675, 3)
1. (5560, 6675, 3)
2. (5560, 6675, 3)
3. (5560, 6675, 3)
4. (6300, 6675, 3)
5. (5560, 6675, 3)
6. (5560, 6675, 3)
7. (5560, 6675, 3)

我想以 4 個批次(例如 0-3 和 4-7)堆疊 arrays,以便 output 陣列的大小為(22980、6675、3)。 這可以使用以下代碼手動完成:

out1 = np.vstack((list_arr[0], list_arr[1], list_arr[2], list_arr[3]))

out2 = np.vstack((list_arr[4], list_arr[5], list_arr[6], list_arr[7]))

但是,我打算將這段代碼升級為長度 = 116 的更長列表,而上述方法效率不高。 有沒有辦法在 for 循環中做到這一點?

您可以對數組列表進行切片並將所需的切片數組傳遞給您的 function

檢查以下示例代碼:

arr_list = [1,2,3,4,5,6,7,8,9,0,12,33,45,66,77,88,23,21]
start = 0
for i in range(0,len(arr_list),4):
    if i == 0:
        continue
    print(arr_list[start:i])
    start = i
if start < len(arr_list):
    print(arr_list[start:])

output 是:

[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 0, 12, 33]
[45, 66, 77, 88]
[23, 21]

如果您的數組的長度是 4 的精確倍數,那么您可以忽略最后一個 if 條件。

解決這個問題的方法不止一種。
讓我向您展示 zip 的示例,讓您探索更多選項。 您也可以嘗試 map、range、np.arange 和其他實用程序。

可以使用的for循環:

for i in zip(*[iter(list_arr)]*4):
    print(np.vstack(i))

另一種選擇 - 帶有 vsplit 的 for 循環:

for i in np.vsplit(list_arr, len(list_arr)//4):
    print(i)

與您一起試運行示例

list_arr = np.array([(6300, 6675, 3),
(5560, 6675, 3),
(5560, 6675, 3),
(5560, 6675, 3),
(6300, 6675, 3),
(5560, 6675, 3),
(5560, 6675, 3),
(5560, 6675, 3)])

for i in zip(*[iter(list_arr)]*4):
    print(np.vstack(i))

Output:
[[6300 6675    3]
 [5560 6675    3]
 [5560 6675    3]
 [5560 6675    3]]
[[6300 6675    3]
 [5560 6675    3]
 [5560 6675    3]
 [5560 6675    3]]

此代碼適用於具有任意數量項目的 arrays,但 output 的子列表將是 4 的倍數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM