【问题标题】:how to subset list base on array in python如何在python中根据数组对列表进行子集化
【发布时间】:2018-04-03 08:21:44
【问题描述】:

我在列表中有以下列名称:

 vars = ['age','balance','day','duration','campaign','pdays','previous','job_admin.','job_blue-collar']

我有一个由数组索引组成的数组

(array([1, 5, 7], dtype=int64),)

我想根据数组索引对列表进行子集化

期望的输出应该是

vars = ['balance','pdays','job_admin.']

我在 python 中尝试过这样的事情

for i, a in enumerate(X):
   if i in new_L:
       print i

但是,它不起作用。

【问题讨论】:

    标签: python python-2.7 list


    【解决方案1】:

    只需使用循环即可:

    result=[]
    for i in your_array:
       result.append(vars[i])
    

    或一个线性

     [vars[i] for i in your_array]
    

    【讨论】:

    • 完美,无需额外库
    【解决方案2】:

    如果您仍然使用numpy,请使用其高级索引

    import numpy as np
    vars = ['age','balance','day','duration','campaign','pdays',
            'previous','job_admin.','job_blue-collar']
    indices = (np.array([1, 5, 7]),)
    
    sub_array = np.asarray(vars)[indices]  
    # --> array(['balance', 'pdays', 'job_admin.'], dtype='<U15')
    

    或者如果你想要list

    sub_list = np.asarray(vars)[indices].tolist()
    # --> ['balance', 'pdays', 'job_admin.']
    

    【讨论】:

      【解决方案3】:
      index = [1, 5, 7]
      vars = [vars[i] for i in index]
      

      【讨论】:

        【解决方案4】:

        如果我理解正确,您的数据是:

        vars = ['age','balance','day','duration','campaign','pdays','previous','job_admin.','job_blue-collar']
        

        和索引是:

        idx = [1, 5, 7]
        

        那么你可以这样做:

        >>> [vars[i] for i in idx]
        ['balance', 'pdays', 'job_admin.']
        

        【讨论】:

        • 为什么将列表理解包含在list 中?这是多余的。
        • @FHTMitchell 已修复 :) 谢谢
        • fyi,list-comps ([ ... ]) 只是在生成器上调用的list() 的语法糖。所以可以使用list(),只要你在里面使用一个生成器,而不是一个列表组合,否则你调用list(list())。然而,使用 list-comps 更符合 Pythonic
        • @JoeIddon 实际上这并不完全正确。 x = range(100_000) %timeit list(i for i in x) 7.59 ms ± 120 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) %timeit [i for i in x] 4.38 ms ± 97.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 列表压缩利用 __len____length_hint__ 在可用的情况下进行预分配内存,使它们(稍微)更有效率。
        • @FHTMitchell 很酷,我猜 Python 也经过优化,所以当您使用 list() 函数时,您正在添加另一个调用。
        【解决方案5】:

        你可以使用operator.itemgetter:

        >>> import numpy as np
        >>> import operator
        >>> vars = ['age','balance','day','duration','campaign','pdays','previous','job_admin.','job_blue-collar']
        >>> idx = np.array([1,5,7])
        >>> operator.itemgetter(*idx)(vars)
        ('balance', 'pdays', 'job_admin.'
        

        这实际上是迄今为止发布的最快的解决方案。

        >>> from timeit import repeat
        >>> kwds = dict(globals=globals(), number=1000000)
        >>> 
        >>> repeat("np.asarray(vars)[idx]", **kwds)
        [2.2382465780247003, 2.225632123881951, 2.1969433058984578]
        >>> repeat("[vars[i] for i in idx]", **kwds)
        [0.9384958958253264, 0.9366465201601386, 0.9373494561295956]
        >>> repeat("operator.itemgetter(*idx)(vars)", **kwds)
        [0.9045725339092314, 0.9015877249184996, 0.9032398068811744]
        

        有趣的是,如果我们先将 idx 转换为列表,它的速度会提高一倍以上,这包括转换成本:

        >>> repeat("operator.itemgetter(*idx.tolist())(vars)", **kwds)
        [0.4062491739168763, 0.4086623480543494, 0.4049343201331794]
        

        我们还可以将结果转换为列表,并且仍然比所有其他解决方案快得多:

        >>> repeat("list(operator.itemgetter(*idx.tolist())(vars))", **kwds)
        [0.561687784967944, 0.5593925788998604, 0.5586365279741585]
        

        【讨论】:

          猜你喜欢
          • 2018-03-10
          • 2015-11-27
          • 1970-01-01
          • 2019-11-08
          • 2013-08-15
          • 2022-11-18
          • 1970-01-01
          • 2016-01-14
          • 2013-04-22
          相关资源
          最近更新 更多