【问题标题】:function to create multidimensional array [duplicate]创建多维数组的函数[重复]
【发布时间】:2019-07-18 05:11:23
【问题描述】:

我想创建一个将 3 元素数组相加的函数。与其他 3 个元素的数组创建一个多维数组,例如 2 个数组:

parameter1 = [29.9, 30,  30.1]
parameter2 = [19.9, 20,  20.1]

multiarray = AddElements(parameter1, parameter2)

多数组输出:

[[[29.9 19.9]
  [29.9 20. ]
  [29.9 20.1]]

 [[30.  19.9]
  [30.  20. ]
  [30.  20.1]]

 [[30.1 19.9]
  [30.1 20. ]
  [30.1 20.1]]]

是否有任何 numpy 函数可以帮助我解决这个问题? 如果能对2个以上的数组执行这个操作就更好了。

【问题讨论】:

    标签: python arrays python-3.x numpy


    【解决方案1】:
    In [441]: parameter1 = [29.9, 30,  30.1] 
         ...: parameter2 = [19.9, 20,  20.1]                                        
    

    itertools 有一个方便的product 函数:

    In [442]: import itertools                                                      
    In [443]: list(itertools.product(parameter1, parameter2))                       
    Out[443]: 
    [(29.9, 19.9),
     (29.9, 20),
     (29.9, 20.1),
     (30, 19.9),
     (30, 20),
     (30, 20.1),
     (30.1, 19.9),
     (30.1, 20),
     (30.1, 20.1)]
    

    这个列表可以放入你想要的数组形式:

    In [444]: np.array(_).reshape(3,3,2)                                            
    Out[444]: 
    array([[[29.9, 19.9],
            [29.9, 20. ],
            [29.9, 20.1]],
    
           [[30. , 19.9],
            [30. , 20. ],
            [30. , 20.1]],
    
           [[30.1, 19.9],
            [30.1, 20. ],
            [30.1, 20.1]]])
    

    添加另一个列表:

    In [447]: C=list(itertools.product(parameter1, parameter2, parameter1))         
    In [448]: np.array(C).reshape(3,3,3,-1)   
    

    仅使用 numpy 函数:

    np.stack(np.meshgrid(parameter1,parameter2,indexing='ij'), axis=2) 
    

    itertools.product 方法更快。

    也受到重复答案的启发:

    def foo(alist):
        a,b = alist  # 2 item for now
        res = np.zeros((a.shape[0], b.shape[0],2))
        res[:,:,0] = a[:,None]
        res[:,:,1] = b
        return res
    foo([np.array(parameter1), np.array(parameter2)])
    

    在此示例中,它的时间与itertools.product 大致相同。

    In [502]: alist = [parameter1,parameter2,parameter1,parameter1]                 
    In [503]: np.stack(np.meshgrid(*alist,indexing='ij'), axis=len(alist)).shape    
    Out[503]: (3, 3, 3, 3, 4)
    

    【讨论】:

    • 赞成。在您的回答中值得一提的是,meshgrid 方法不能轻易扩展到超过 2 个数组的情况。
    • 我添加了一个更大的meshgrid 案例。扩展同样容易,甚至更容易。
    【解决方案2】:

    我认为现有的 numpy 函数可以更有效地执行此操作,但此解决方案应该为您提供正确的输出。

    import numpy as np
    
    a = [29.9, 30,  30.1]
    b = [19.9, 20,  20.1]
    
    compound_list = [[[ai, bi] for bi in b] for ai in a]
    print(np.array(compound_list))
    

    输出:

    [[[29.9 19.9]
      [29.9 20. ]
      [29.9 20.1]]
    
     [[30.  19.9]
      [30.  20. ]
      [30.  20.1]]
    
     [[30.1 19.9]
      [30.1 20. ]
      [30.1 20.1]]]
    

    【讨论】:

    • 感谢您的快速解释,是否还有一种方法可以对 2 个以上的列表执行此操作,而无需对您执行此操作的列表数量进行硬编码?
    猜你喜欢
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2021-10-27
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多