【问题标题】:Combining 3 Arrays into 1 Matrix (Python 3)将 3 个数组组合成 1 个矩阵(Python 3)
【发布时间】:2019-06-24 21:15:03
【问题描述】:

我有 3 个长度相等的数组(例如):

  1. [a, b, c]
  2. [1, 2, 3]
  3. [i, ii, iii]

我想将它们组合成一个矩阵:

|a, 1, i  |
|b, 2, ii |
|c, 3, iii|

我遇到的问题是,当我使用dstackhstackconcatenate 等代码时。我以我可以使用的方式对它们进行数字添加或堆叠。

【问题讨论】:

  • 你可能需要zip
  • 我建议您也分享您的代码。目前尚不清楚您想要获得什么样的输出,并且您使用的名称表示可能需要或可能不需要的对象的混合。例如,您的输入似乎是异构的(数字、字符串等),您可能在lists 中拥有这些,但后来您似乎使用了numpy 函数(例如dstackhstack)在numpys 数组上,它们(通常)是齐次的,并且在严格的矩阵结构中要么不存在(对于lists),要么被弃用(在numpy)。
  • 也许,您正在寻找的是一种结构化表格数据的方法,在这种情况下,我会查看pandas
  • 我想你是说每个数组都是不同的数据类型?在这种情况下,您应该查看pandas
  • @Darius Modirrousta-Galian 请点击旁边的勾号接受帮助您解决问题的答案,谢谢!

标签: python arrays list merge concatenation


【解决方案1】:

假设你有 3 个 numpy 数组:

>>> a, b, c = np.random.randint(0, 9, 9).reshape(3, 3)
>>> print(a, b, c)
[4 1 4] [5 8 5] [3 0 2]

然后您可以将它们垂直堆叠(即沿第一个维度),然后转置结果矩阵以获得您需要的顺序:

>>> np.vstack((a, b, c)).T
array([[4, 5, 3],
       [1, 8, 0],
       [4, 5, 2]])

一个稍微冗长的例子是改为水平堆叠,但这需要使用reshape 将数组制作成二维:

>>> np.hstack((a.reshape(3, 1), b.reshape(3, 1), c.reshape(3, 1)))
array([[4, 5, 3],
       [1, 8, 0],
       [4, 5, 2]])

【讨论】:

    【解决方案2】:

    你可以使用zip():

    映射多个容器的相似索引,以便它们可以仅用作单个实体。

    a1 = ['a', 'b', 'c']
    
    b1 = ['1', '2', '3']
    
    c1 =  ['i', 'ii', 'iii']
    
    
    print(list(zip(a1,b1,c1)))
    

    输出:

    [('a', '1', 'i'), ('b', '2', 'ii'), ('c', '3', 'iii')]
    

    编辑:

    我只是想着往前走,之后把列表展平然后用numpy.reshape

    flattened_list = []
    
    #flatten the list
    for x in res:
        for y in x:
            flattened_list.append(y)
    
    #print(flattened_list)
    
    import numpy as np
    data = np.array(flattened_list)
    shape = (3, 3)
    print(data.reshape( shape ))
    

    输出:

    [['a' '1' 'i']
     ['b' '2' 'ii']
     ['c' '3' 'iii']]
    

    对于那里的一个班轮:

    #flatten the list
    for x in res:
        for y in x:
            flattened_list.append(y)
    
    # print(flattened_list)
    
    print([flattened_list[i:i+3] for i in range(0, len(flattened_list), 3)])
    

    输出:

    [['a', '1', 'i'], ['b', '2', 'ii'], ['c', '3', 'iii']]
    

    正如@norok2 建议的那样

    print(list(zip(*zip(a1, b1, c1))))
    

    输出:

    [('a', 'b', 'c'), ('1', '2', '3'), ('i', 'ii', 'iii')]
    

    【讨论】:

    • 一个更简洁的转置你的矩阵列表列表的方法是使用zip()两次,例如list(zip(*zip(a1, b1, c1)))
    • @norok2 甜,是的。已添加
    • @norok2 你现在是故意这样做的! :p
    【解决方案3】:

    这会给你一个元组列表,这可能不是你想要的:

    >>> list(zip([1,2,3],[4,5,6],[7,8,9]))
    [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
    

    这会给你一个 numpy 数组:

    >>> from numpy import array
    >>> array([[1,2,3],[4,5,6],[7,8,9]]).transpose()
    array([[1, 4, 7],
           [2, 5, 8],
           [3, 6, 9]])
    

    【讨论】:

      【解决方案4】:

      如果每个数组中有不同的数据类型,那么使用pandas 是有意义的:

      # Iterative approach, using concat
      import pandas as pd
      my_arrays = [['a', 'b', 'c'], [1, 2, 3], ['i', 'ii', 'iii']]
      df1 = pd.concat([pd.Series(array) for array in my_arrays], axis=1)
      
      # Named arrays
      array1 = ['a', 'b', 'c']
      array2 = [1, 2, 3]
      array3 = ['i', 'ii', 'iii']
      df2 = pd.DataFrame({'col1': array1,
                          'col2': array2,
                          'col3': array3})
      

      现在您有了所需的结构,每列都有适当的数据类型:

      print(df1)
      #    0  1    2
      # 0  a  1    i
      # 1  b  2   ii
      # 2  c  3  iii
      
      print(df2)
      #   col1  col2 col3
      # 0    a     1    i
      # 1    b     2   ii
      # 2    c     3  iii
      
      print(df1.dtypes)
      # 0    object
      # 1     int64
      # 2    object
      # dtype: object
      
      print(df2.dtypes)
      # col1    object
      # col2     int64
      # col3    object
      # dtype: object
      

      您可以使用.values 属性提取numpy 数组:

      df1.values
      # array([['a', 1, 'i'],
      #        ['b', 2, 'ii'],
      #        ['c', 3, 'iii']], dtype=object)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-30
        • 2018-05-03
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        • 2013-02-19
        • 2011-09-17
        相关资源
        最近更新 更多