【问题标题】:What's the most efficient way to split up a Numpy ndarray using percentage?使用百分比拆分 Numpy ndarray 的最有效方法是什么?
【发布时间】:2019-04-13 06:27:19
【问题描述】:

您好,我是 Python 和 Numpy 的新手,我想问一下将 ndarray 分成 3 部分的最有效方法是什么:20%、60% 和 20%

    import numpy as np
    row_indices = np.random.permutation(10)

假设 ndarray 有 10 个项目:[7 9 3 1 2 4 5 6 0 8] 预期结果是将 ndarray 分成 3 个部分,如 part1、part2 和 part3。
part1: [7 9]
第 2 部分: [3 1 2 4 5]
第 3 部分: [0 8]

【问题讨论】:

    标签: python numpy numpy-ndarray


    【解决方案1】:

    这是一种方法-

    # data array
    In [85]: a = np.array([7, 9, 3, 1, 2, 4, 5, 6, 0, 8])
    
    # percentages (ratios) array
    In [86]: p = np.array([0.2,0.6,0.2]) # must sum upto 1
    
    In [87]: np.split(a,(len(a)*p[:-1].cumsum()).astype(int))
    Out[87]: [array([7, 9]), array([3, 1, 2, 4, 5, 6]), array([0, 8])]
    

    np.split 的替代方案:

    np.split 在处理大数据时可能会变慢,因此,我们也可以在那里使用循环 -

    split_idx = np.r_[0,(len(a)*p.cumsum()).astype(int)]
    out = [a[i:j] for (i,j) in zip(split_idx[:-1],split_idx[1:])]
    

    【讨论】:

      【解决方案2】:

      我通常只选择最明显的解决方案,尽管有很多更好的方法可以做到这一点。实现只需要一秒钟,甚至不需要调试(因为它非常简单)

      part1 = [a[i, ...] for i in range(int(a.shape[0] * 0.2))]
      part2 = [a[i, ...] for i in range(int(a.shape[0] * 0.2), int(len(a) * 0.6))]
      part3 = [a[i, ...] for i in range(int(a.shape[0] * 0.6), len(a))]
      

      有几点需要注意

      1. 这是四舍五入的,因此您可以得到大约只有 20-60-20 分割的东西
      2. 您会返回一个元素列表,因此您可能需要使用 np.asarray() 重新对它们进行 numpyfy
      3. 您可以使用此方法为相同元素的多个对象(例如标签和输入)建立索引
      4. 如果您在拆分前获得一次索引 (indices = list(range(a.shape[0]))),您还可以对它们进行混洗,从而同时处理数据混洗

      【讨论】:

        猜你喜欢
        • 2014-01-28
        • 2022-10-04
        • 1970-01-01
        • 2020-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-18
        • 1970-01-01
        相关资源
        最近更新 更多