如何将 vstack 代码转换为 for-loop (Python)?
How to convert vstack code to for-loop (Python)?
我目前有一个列表 (list_arr),其中包含 8 个具有以下大小的 numpy 数组:
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)堆叠数组,以便输出数组的大小为 (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 循环中执行此操作?
您可以对数组列表进行切片并将所需的切片数组传递给您的函数
检查下面的示例代码:
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:])
输出为:
[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))
另一个选项 - for 循环与 vsplit:
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]]
此代码适用于包含任意数量项目的数组,但输出将包含 4 的倍数的子列表。
我目前有一个列表 (list_arr),其中包含 8 个具有以下大小的 numpy 数组:
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)堆叠数组,以便输出数组的大小为 (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 循环中执行此操作?
您可以对数组列表进行切片并将所需的切片数组传递给您的函数
检查下面的示例代码:
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:])
输出为:
[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))
另一个选项 - for 循环与 vsplit:
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]]
此代码适用于包含任意数量项目的数组,但输出将包含 4 的倍数的子列表。