【问题标题】:Python : how to make 1-D array from 2-D arrayPython:如何从二维数组制作一维数组
【发布时间】:2019-01-11 02:29:28
【问题描述】:

我有array2D = [[1,2,3],[4,5,6]]。我想要的是一个函数,它接受一个索引并返回一维数组中的元素。

Example: fn(0) -> returns [1,4]
         fn{1) -> returns [2,5]

我需要一个快速的方法来做到这一点。

【问题讨论】:

    标签: python loops for-loop while-loop


    【解决方案1】:

    发电机怎么样?

    我们可以使用zip 打包它们,然后创建一个空列表来存储生成的数据:

    class myZip(object):
        __slots__ = ('zipData', 'interList')
    
        def __init__(self, *args):
            self.zipData = zip(*args)
            self.interList = []
    
        def __call__(self, index):
            try:
                return self.interList[index]
            except IndexError:
                try:
                    if index == 0:
                        self.interList.append(next(self.zipData))
                        return self.interList[index]
                    for i in range(index-(len(self.interList)-1)):
                        self.interList.append(next(self.zipData))
                    return self.interList[index]
                except StopIteration:
                    raise IndexError("index out of range")
    
        def __iter__(self):
            for i in self.interList:
                yield i
    
            for i in self.zipData:
                yield i
    
    array2D = [[1,2,3],[4,5,6]]
    
    a = myZip(*array2D)
    
    print(a(2))
    print(a(1))
    print(a(0))
    ---
    (3, 6)
    (2, 5)
    (1, 4)
    

    这样做的好处是我们不需要一次生成所有数据。

    【讨论】:

      【解决方案2】:

      这是我使用切片的两分钱(我必须为此使用额外的np.array(),因为您的原始数据是list):

      array2D = np.array([[1,2,3],[4,5,6]])
      
      def fn(n): return (list(array2D[:,n]))
      
      print (fn(0), fn(1), fn(2))
      

      【讨论】:

        【解决方案3】:

        你可以使用lambdalist comprehension

        array2D = [[1,2,3],[4,5,6]]
        
        fn = lambda x: [item[x] for item in array2D]
        
        print(fn(0)) # [1, 4]
        print(fn(1)) # [2, 5]
        print(fn(2)) # [3, 6]
        

        按照 cmets 中的建议,您可以将 same 概念与函数定义一起应用:

        def fn(x): return [item[x] for item in array2D]
        
        print(fn(0)) # [1, 4]
        print(fn(1)) # [2, 5]
        print(fn(2)) # [3, 6]
        

        Lambda 函数是pretty useful,让您以非常清晰的方式定义操作。
        在我们的示例中,我们的 lambda 接受一个变量 x,它表示我们想要的 array2D 中每个 item 的索引

        那么你有list comprehension,类似于lambda函数,它们是一个非常强大的工具,也是python中的必须

        在这种情况下,您应该优先考虑函数定义,正如 PEP-8 所建议的那样。

        【讨论】:

        • 你能解释一下为什么(如果全部的话)lambda函数比普通函数更清晰吗? IMO,这是一个不必要的额外函数调用。
        • @jpp 我没有说 lambda 函数比常规函数更清晰。我说lambda函数真的很清楚:通常是因为需要在一行中定义操作的简洁性需要对问题有清晰的认识。当然,如果我们愿意,我们可以使任何事情复杂化
        • 好吧,看起来lambda 实际上复杂 很重要。为什么不def fn(x): return [item[x] for item in array2D]?还是一行。并且字符更少(如果重要的话)。
        • @jpp 让事情变得多么复杂?
        • 如果你真的想要一个函数为这样的通用任务返回一个函数,请使用functools.partial,查看我的更新。
        【解决方案4】:

        你可以使用operator.itemgetter:

        array2D = [[1,2,3],[4,5,6]]
        
        from operator import itemgetter
        
        def fn(x, k):
            return list(map(itemgetter(k), x))
        
        fn(array2D, 0)  # [1, 4]
        

        如果您想定义用于检索特定索引的新函数,可以通过functools.partial 进行:

        from functools import partial
        
        def fn(x, k):
            return list(map(itemgetter(k), x))
        
        get_zero_index = partial(fn, k=0)
        get_zero_index(array2D)  # [1, 4]
        

        【讨论】:

          【解决方案5】:

          以下列表推导将起作用:

          def fn(i, lst):
              return [sublst[i] for sublst in lst]
          
          >>> array2D = [[1, 2, 3], [4, 5, 6]]
          >>> fn(0, array2D)
          [1, 4]
          >>> fn(1, array2D)
          [2, 5]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-01-04
            • 1970-01-01
            • 1970-01-01
            • 2011-07-23
            • 1970-01-01
            • 1970-01-01
            • 2017-08-27
            • 2014-11-17
            相关资源
            最近更新 更多