Python:为变量创建高斯分布,并使用高斯值在循环中运行程序



我还在学习python,正在努力解决这个问题:

我正在使用一个名为Fatiando a Terra的工具包在python中运行脚本;我定义了一个物体的参数,然后用重力/梯度法对它进行建模,如下所示:

import numpy as np
from fatiando.vis import mpl
from fatiando.mesher import Prism
from fatiando.gravmag import prism
from fatiando.constants import G
from fatiando import utils
import fatiando
import matplotlib.pyplot as plt
model = Prism(-1000, 1000, -1000, 1000, 1000, 1100, {'density': 300})
n = 500
x = np.zeros(n)
y = np.zeros(n)
z = np.linspace(0, 2000, n)
data = np.array([prism.gx(x, y, z, [model]),
                 prism.gy(x, y, z, [model]),
                 prism.gz(x, y, z, [model]),
                 prism.gxx(x, y, z, [model]),
                 prism.gxy(x, y, z, [model]),
                 prism.gxz(x, y, z, [model]),
                 prism.gyy(x, y, z, [model]),
                 prism.gyz(x, y, z, [model]),
                 prism.gzz(x, y, z, [model])])

在此之后,我使用python绘制它,但是这段代码不相关。

我手动执行了一个很小的高斯数组,使用:

from numpy.random import multivariate_normal
multivariate_normal([300]. [[300]], 10)

它提供给我的10个值我手动输入到我的脚本并生成输出。

我要做的是对300的密度值执行高斯分布+-100。我想生成1000个值,并将它们循环回脚本,运行程序1000次,每个密度变量一次。

对于输出,我目前使用:

titles = ['gx', 'gy', 'gz', 'gxx', 'gxy', 'gxz', 'gyy', 'gyz', 'gzz']
np.savetxt(title, np.vstack((z.ravel(), d.ravel())).T)

理想情况下,对于高斯数组,我希望以相同的方式输出文本,但使用1000个样本的平均值而不是任何单个值。标准偏差也会很好。


如果我问得太多,我道歉,并非常感谢任何可用的帮助。干杯!

这与其说是一个回答,不如说是一个扩展的评论,尽管它也可能是后者。

将代码封装在函数中,然后在循环中调用该函数,最后取结果的平均值,可能看起来像这样(部分符号):

##import statements
NDENSITIES = 1000
def dowork(density):
    model = Prism(-1000, 1000, -1000, 1000, 1000, 1100, {'density': 300})
    ##other code
    return data   ## or whatever is important
densities = multivariate_normal([300], [[300]], NDENSITIES)
results = []
for density in range(densities):
    results.append(dowork(density))
results = np.vstack(results)   ## or hstack or dstack, depending on the dimensions of `data`
mean = results.mean()   # possibly: results.mean(axis=0) or with axis=1 etc. Again dependent on the dimensions
std = results.std()

最新更新