【问题标题】:How to convert vstack code to for-loop (Python)?如何将 vstack 代码转换为 for-loop (Python)?
【发布时间】:2021-07-15 06:46:12
【问题描述】:

我目前有一个列表 (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 循环中做到这一点?

【问题讨论】:

  • 请通过intro tourhelp centerhow to ask a good question 了解本网站的运作方式并帮助您改进当前和未来的问题,从而帮助您获得更好的答案。 “告诉我如何解决这个编码问题?”与 Stack Overflow 无关。您必须诚实地尝试解决方案,然后就您的实施提出具体问题。 Stack Overflow 无意取代现有的教程和文档。
  • 键入这些列表可能会很痛苦,但不会对运行时间造成太大影响。 vstack 只需要一个列表,所以列表切片应该很简单。

标签: python arrays numpy for-loop vstack


【解决方案1】:

您可以对数组列表进行切片并将所需的切片数组传递给您的函数

查看以下示例代码:

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 条件。

【讨论】:

    【解决方案2】:

    解决这个问题的方法不止一种。
    让我向您展示一个 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]]
    

    此代码适用于包含任意数量项的数组,但输出的子列表将是 4 的倍数。

    【讨论】:

      猜你喜欢
      • 2019-10-09
      • 2022-12-30
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2021-03-26
      相关资源
      最近更新 更多