为每个网格点计算值数组

1 投票
1 回答
552 浏览
提问于 2025-04-19 10:26

我有一个函数,这个函数需要一些参数,然后输出一个数组。比如说:

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

这里的xs是一个包含值的数组。假设我还有每个参数的值列表:

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循环来实现,但我在想是否可以用meshgrid来做。我试过以下的方法,但出现了问题:

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.meshgrid的顺序一致,也就是xs,param1,param2,param3

编辑2:

抱歉,我刚刚发现了np.meshgrid的“indexing”关键字。如果有人需要像我一样使用索引,可以用np.meshgrid(arguments,indexing='ij')

1 个回答

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)

撰写回答