我还在学习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()