计算每个网格网格点的值数组

时间:2014-09-02 16:34:29

标签: python numpy

我有一个依赖于某些参数的函数,哪个输出是一个数组。例如:

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)

我想为params1,params2和params3的每个可能组合计算my_func的输出。这个想法是能够计算卡方并用输出进行贝叶斯分析。 我知道它可以用嵌套的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在输出中放入轴= 1?我希望订单能够遵循传递给np.mesgrid的内容,即xs,param1,param2, param3

EDIT2:

抱歉,我刚刚发现np.meshgrid的“索引”键工作。如果有人在我计划使用索引时需要索引,请使用np.meshgrig(arguments,indexing='ij')

1 个答案:

答案 0 :(得分: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)