创建多维数组的函数

时间:2019-02-24 18:53:53

标签: python arrays python-3.x numpy

我想创建一个将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 个答案:

答案 0 :(得分:3)

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)

答案 1 :(得分:1)

我认为现有的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]]]