【问题标题】:what is the most pythonic way to split a 2d array to arrays of each row?将二维数组拆分为每行数组的最pythonic方法是什么?
【发布时间】:2017-11-17 14:49:43
【问题描述】:

我有一个函数 foo,它返回一个形状为 (1000, 2) 的数组 如何将其拆分为两个数组 a(1000) 和 b(1000) 我正在寻找这样的东西:

a;b = foo()

我正在寻找一个可以轻松概括为形状为 (1000, 5) 左右的情况的答案。

【问题讨论】:

  • 谈论 python list 或 numpy 数组?
  • @schwobaseggl 我想默认是python列表。

标签: python arrays multidimensional-array


【解决方案1】:

转置和解包?

a, b = foo().T

>>> a, b = np.arange(20).reshape(-1, 2).T
>>> a
array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])
>>> b
array([ 1,  3,  5,  7,  9, 11, 13, 15, 17, 19])

【讨论】:

    【解决方案2】:

    zip(*...) 成语转换了传统的多维 Python list

    x = [[1,2], [3,4], [5,6]]
    
    # get columns    
    a, b = zip(*x)   # zip(*foo())
    # a, b = map(list, zip(*x))  # if you prefer lists over tuples
    a
    # (1, 3, 5)
    
    # get rows
    a, b, c = x
    a
    # [1, 2]
    

    【讨论】:

      【解决方案3】:

      您可以使用numpy.hsplit

      x = np.arange(12).reshape((3, 4))
      np.hsplit(x, x.shape[1])
      

      这将返回一个子数组列表。请注意,在二维输入的情况下,子数组的形状为 (n, 1)。除非你在它周围包裹一个函数来将它们压缩到 1d:

      def split_1d(arr_2d):
          """Split 2d NumPy array on its columns."""
          split = np.hsplit(arr_2d, arr_2d.shape[1])
          split = [np.squeeze(arr) for arr in split]
          return split
      
      a, b, c, d = split_1d(x)
      
      a
      # array([0, 4, 8])
      
      d
      # array([ 3,  7, 11])
      

      【讨论】:

        【解决方案4】:

        你可以只使用列表推导,例如

        (a,b)=([i[0] for i in mylist],[i[1] for i in mylist])
        

        为了概括,您可以在理解中使用理解:

        (a,b,c,d,e)=([row[i] for row in mylist] for i in range(5))
        

        【讨论】:

          【解决方案5】:

          你可以简单地使用zip函数来做到这一点:

          def foo(mylist):
             return zip(*mylist)
          

          现在调用foo,其维度与 mylist 中的一样多,它会执行以下必要操作:

          mylist = [[1, 2], [3, 4], [5, 6]]
          a, b = foo(mylist)
          # a = (1, 3, 5)
          # b = (2, 4, 6)
          

          【讨论】:

          • @schwobaseggl 整整 5 分钟前提供了这个确切的答案,为什么要复制它?
          • @BradSolomon 哦,我之前没看到。对不起。
          【解决方案6】:

          所以这有点疯狂,但是如果你想为数组中的每个子数组分配不同的字母,并且对任意数量的子数组(最多 26 个,因为字母表)这样做,你可以这样做:

          import string
          letters = list(string.ascii_lowercase)  # get all of the lower-case letters
          arr_dict = {k: v for k, v in zip(letters, foo())}
          

          或更简单的(最后一行):

          arr_dict = dict(zip(letters, foo()))
          

          然后您可以使用arr_dict['a']arr_dict['b'] 访问每个单独的元素。这对我来说有点疯狂科学家的感觉,但我认为这很有趣。

          【讨论】:

          • 你疯了:))
          • dict(zip(letters, foo()))
          • @BradSolomon 哦,是的,忘了你也可以这样做。我会添加它,谢谢。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-18
          • 1970-01-01
          • 1970-01-01
          • 2014-08-28
          • 1970-01-01
          相关资源
          最近更新 更多