如何将 vstack 代码转换为 for 循环Python?

问题描述

我目前有一个列表 (list_arr),其中包含 8 个具有以下大小的 numpy 数组:

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

我想以 4 个批次(例如 0-3 和 4-7)堆叠数组,以便输出数组的大小为 (22980,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,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,4]
[5,8]
[9,33]
[45,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,(6300,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 的倍数的子列表。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...