【问题标题】:vertical stack numpy array in for loopfor循环中的垂直堆栈numpy数组
【发布时间】:2021-12-27 08:02:31
【问题描述】:

我有一个列表(region_props_list),大小 = 37,它具有如下所示的 2D numpy 数组的值。 (因此,region_props_list[0] 是一个 numpy 数组。)

我想把所有数据垂直堆叠,做成一个新的pandas DataFrame,形状为($$, 7)

如何使用 for 循环垂直堆叠数据?有人可以给我一个建议吗?

【问题讨论】:

    标签: python numpy for-loop stack


    【解决方案1】:

    您不需要 for 循环。你可以改用np.vstack

    import numpy as np
    
    lst = [np.array([[1, 2], [3, 4]]), np.array([[5, 6]]), np.array([[7, 8], [9, 10]])]
    a = np.vstack(lst)
    print(a)
    
    # [[ 1  2]
    #  [ 3  4]
    #  [ 5  6]
    #  [ 7  8]
    #  [ 9 10]]
    

    如果您的目标是构建一个数据框,那么您可以将itertools.chainpd.DataFrame.from_records 一起使用(甚至无需制作v-stacked 数组):

    import numpy as np
    import pandas as pd
    import itertools
    
    lst = [np.array([[1, 2], [3, 4]]), np.array([[5, 6]]), np.array([[7, 8], [9, 10]])]
    df = pd.DataFrame.from_records(itertools.chain.from_iterable(lst))
    print(df)
    
    #    0   1
    # 0  1   2
    # 1  3   4
    # 2  5   6
    # 3  7   8
    # 4  9  10
    

    附:请不要发截图。制作一个人们可以轻松处理的可复制和粘贴的最小示例。

    【讨论】:

    • 感谢您的回答。但我要处理的真实数据很大,列表大小有数百。那么我该如何使用 for 循环呢?
    • @MinwooKang 即使数据很大,我也怀疑for 循环更好。相反,当列表很长时,我认为您应该尽可能避免使用for 循环。您可以直接使用pd.DataFrame.from_records 来制作数据框,使用itertools.chain。这样,您甚至不需要制作中间堆叠数组。请检查更新的答案。
    • 如果给DataFrame 一个合适的数组,它将使用该数组而不进行复制。您可能需要时间测试您的替代方案。
    • @hpaulj 这似乎是正确的;修改原始数组也会改变 df。
    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 2021-07-22
    相关资源
    最近更新 更多