2014-09-02 101 views
1

我有一个函数,它依赖于一些参数和哪个输出是一个数组。例如:计算每个meshgrid点的值数组

def my_func(xs,param1,param2,param3): 
    values = xs**param1 + xs*param2**2 + param3*xs 
    return values 

其中xs是一个包含值的数组。 Suposse我也有每个参数的值的列表:

xs = np.arange(0,10,1) 
params1 = np.arange(5,10,1) 
params2 = np.arange(1,30,1) 
params3 = np.arange(1,20,1) 

我想计算my_func,并将输出为params1,params2和params3的每个可能的组合。这个想法是能够计算卡方,并用输出进行贝叶斯分析。 我知道它可以用嵌套for循环完成,但我想知道是否可以用mehsgrid完成。我尝试以下,但它打破:

P1, P2, P3 = np.meshgrid(params1,params2,params3) 
results = my_func(xs,P1,P2,P3) 

     1 def my_func(xs,param1,param2,param3): 
----> 2  values = xs**param1 + xs*param2**2 + param3*xs 
     3 
     4 
     5 xs = np.arange(0,10,0.1) 

     ValueError: operands could not be broadcast together with shapes (100,) (10,10,40) 

如何可以做到这一点(如果是可以做到的)任何想法?

编辑: @unutbu的答案工作,但没有我有一个额外的问题关于其输出格式。我改变了参数范围,因此可以很容易地解释。

传递xs作为参数用于np.meshgrid后,results形状是

np.shape(results) 
(5, 10, 29, 19) 

含义是: axis0是param1, AXIS1是xs, 的axis2是param2,和 axis3是param3

为什么xs将axis = 1放在输出中?我预计订单将遵循传递给np.mesgrid的数量,即xs,param1,param2, param3

EDIT2:

对不起,我刚才发现了np.meshgrid的 “索引” keyworkd。如果任何人需要使用索引,请使用np.meshgrig(arguments,indexing='ij')

回答

1

xs也作为参数传递给np.meshgrid

import numpy as np 

def my_func(xs,param1,param2,param3): 
    values = xs**param1 + xs*param2**2 + param3*xs 
    return values 

xs = np.arange(0,10,0.1) 
params1 = np.arange(1,2,0.1) 
params2 = np.arange(1,2,0.1) 
params3 = np.arange(1,5,0.1) 

X, P1, P2, P3 = np.meshgrid(xs, params1, params2, params3, sparse=True, indexing='ij') 
my_func(X, P1, P2, P3) 
+0

感谢您的帮助,该工作:)现在,我有一个关于输出格式的额外问题。我编辑了我的问题来解释它。 – 2014-09-03 15:10:29

+0

哦,很好 - 看起来你已经找到了答案。 – unutbu 2014-09-03 17:16:27