【问题标题】:Store data for a loop为循环存储数据
【发布时间】:2017-12-17 00:42:21
【问题描述】:

我正在使用蒙特卡洛方法进行数值积分。我已经设法使函数工作,但现在我正试图将结果存储在一个矩阵中,这样我就可以将所有内容绘制在一起。

这是我的错误: ``Traceback(最近一次通话最后): 文件“mcmc.py”,第 41 行,在 result_array = 列表(fnArea) TypeError: 'float' 对象不可迭代

这是我的代码:

from math import *
from random import *
import numpy as np

def f(a):
    return sin(a)

amin = 0.0
amax = 2.0*pi

numRep = 100  #quanto maior, mais preciso porem mais devagar
bmin = f(amin)
bmax = bmin
for i in range(numRep):
    a = amin + (amax - amin) * float(i)/numRep
    b = f(a)
    if b < bmin: bmin = b
    if b > bmax: bmax = b

retArea = (amax - amin)*(bmax - bmin) #definicao da integral
numPontos = 100
soma = 0
for j in range(numPontos):
   a = amin + (amax - amin) * random()
   b = bmin + (bmax - bmin) * random()
   if fabs(b) <= fabs(f(a)):
        if f(a) > 0 and b > 0 and b <= f(a):
            soma += 1
        if f(a) < 0 and b < 0 and b >= f(a):
            soma -= 1

fnArea = retArea * float(soma)/numPontos 
print (str(fnArea))

result_array = np.empty((0,100))
count = 100
for i in range(count):
    fnArea = retArea * (soma)/numPontos
    result_array = list(fnArea)


print (result_array)

【问题讨论】:

  • 您是否要创建列表并存储在result_array 中?请参阅下面的答案。

标签: python python-3.x


【解决方案1】:

您收到错误是因为

result_array = list(fnArea)

这里你试图将一个浮点数变成一个无效的列表。

这是一个工作代码,但我不确定你得到的结果是否正确。

这里我们将 result_array 设为一维零数组,然后根据 i 替换每一列。

from math import *
from random import *
import numpy as np

def f(a):
    return sin(a)

amin = 0.0
amax = 2.0*pi

numRep = 100  #quanto maior, mais preciso porem mais devagar
bmin = f(amin)
bmax = bmin
for i in range(numRep):
    a = amin + (amax - amin) * float(i)/numRep
    b = f(a)
    if b < bmin: bmin = b
    if b > bmax: bmax = b

retArea = (amax - amin)*(bmax - bmin) #definicao da integral
numPontos = 100
soma = 0
for j in range(numPontos):
   a = amin + (amax - amin) * random()
   b = bmin + (bmax - bmin) * random()
   if fabs(b) <= fabs(f(a)):
        if f(a) > 0 and b > 0 and b <= f(a):
            soma += 1
        if f(a) < 0 and b < 0 and b >= f(a):
            soma -= 1

fnArea = retArea * float(soma)/numPontos 
print (str(fnArea))

result_array = np.zeros((1,100))
count = 100
for i in range(count):
    fnArea = retArea * (soma)/numPontos
    result_array[0,i] = fnArea


print (result_array)

【讨论】:

    【解决方案2】:

    您收到此错误是因为您试图将 float object [number] 转换为 list [which is iterable]。

    如果您尝试创建一个具有fnArea 值的列表列表。我已将您的 result_array 声明修改为 python 列表,而不是 numpy 数组并在 for 循环中附加 fnArea 的值。请看下面的答案:

    from math import *
    from random import *
    import numpy as np
    
    def f(a):
        return sin(a)
    
    amin = 0.0
    amax = 2.0*pi
    
    numRep = 100  #quanto maior, mais preciso porem mais devagar
    bmin = f(amin)
    bmax = bmin
    for i in range(numRep):
        a = amin + (amax - amin) * float(i)/numRep
        b = f(a)
        if b < bmin: bmin = b
        if b > bmax: bmax = b
    
    retArea = (amax - amin)*(bmax - bmin) #definicao da integral
    numPontos = 100
    soma = 0
    for j in range(numPontos):
       a = amin + (amax - amin) * random()
       b = bmin + (bmax - bmin) * random()
       if fabs(b) <= fabs(f(a)):
            if f(a) > 0 and b > 0 and b <= f(a):
                soma += 1
            if f(a) < 0 and b < 0 and b >= f(a):
                soma -= 1
    
    fnArea = retArea * float(soma)/numPontos 
    print (str(fnArea))
    
    result_array = []
    count = 100
    for i in range(count):
        fnArea = retArea * (soma)/numPontos
        print fnArea
        result_array.append([fnArea])
    
    
    
    print (result_array)
    

    【讨论】:

      猜你喜欢
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      相关资源
      最近更新 更多