我想创建一个将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函数可以帮助我解决这个问题? 如果它可以对两个以上的数组执行此操作,那就更好了。
答案 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]]]