3

我正在尝试在 python 中创建累积分布,但不断得到AttributeError,我的代码如下:

import sys
import scipy.stats
import numpy 

def CDF_Random(N,NE,E,SE,S,SW,W,NW,Iterations):
    WindDir = [0,45,90,135,180,225,270,315]
    Freq = [N,NE,E,SE,S,SW,W,NW]

    cdf=scipy.stats.rv_discrete.cdf(WindDir,Freq)  
    cdf_rand=cdf.rvs(size=Iterations)    
    return (cdf_rand)

if __name__ == '__main__':
    N = float(sys.argv[1])
    NE = float(sys.argv[2])
    E = float(sys.argv[3])
    SE = float(sys.argv[4])
    S = float(sys.argv[5])
    SW = float(sys.argv[6])
    W = float(sys.argv[7])
    NW = float(sys.argv[8])
    Iterations = float(sys.argv[9])
    numpy.set_printoptions(threshold=Iterations)
    sys.stdout.write(str(CDF_Random(N,NE,E,SE,S,SW,W,NW,Iterations)))

我得到的错误取决于我使用的值WindDir amd Freq,有时它们是数组,如上面的代码所示,有时其中一个是单个整数,或者它们都是或一个可能是 0 和 1 之间的数字。

AttributeError: 'int' object has no attribute '_fix_loc'

或者

AttributeError: 'list' object has no attribute '_fix_loc'

或者

AttributeError: 'float' object has no attribute '_fix_loc'

我已经浏览了谷歌搜索和这个网站,但我没有运气,我也花了很长时间改变我的输入和使用 python 网站。

编辑 我尝试过的输入:请注意,由于输入数组的长度不同,因此需要为某些输入编辑代码。这些都是通过命令提示符运行的

python C:\Users\...\python\CDF.py 0.01 0.02 0.03 0.4 0.98 0.99 1 5

这给出了这个错误

AttributeError: 'list' object has no attribute '_fix_loc'

编辑完代码 import sys import scipy.stats import numpy

def CDF_Random():

    cdf=scipy.stats.rv_discrete.cdf(5,1)

   cdf_rand=cdf.rvs(size=Iterations)    
    return (cdf_rand)

    return (cdf)

if __name__ == '__main__':

    sys.stdout.write(str(CDF_Random()))

返回以下错误

AttributeError:“int”对象没有属性“_fix_loc”

def CDF_Random():

    cdf=scipy.stats.rv_discrete.cdf(0.5,1)

   cdf_rand=cdf.rvs(size=Iterations)    
    return (cdf_rand)

    return (cdf)

if __name__ == '__main__':

    sys.stdout.write(str(CDF_Random()))

出现此错误

AttributeError: 'float' object has no attribute '_fix_loc'

我还尝试了其他组合,例如将数组作为第一个变量,将整数和浮点数作为第二个变量。

cdf=scipy.stats.rv_discrete.cdf([array],0.5)
cdf=scipy.stats.rv_discrete.cdf([array],[array])
cdf=scipy.stats.rv_discrete.cdf(4,[array])
cdf=scipy.stats.rv_discrete.cdf([array],5)
4

1 回答 1

2

scipy.stats.rv_discrete.cdf评估您在某些列出的分位数上的分布。您必须先进行分配。尝试:

mydist = scipy.stats.rv_discrete(name = 'mydistribution', values=(WindDir,Freq))

注意:Freq 实际上应该是概率并且总和为 1,因此您应该在将每个成员除以 Freq 的总和之前将其传递给.rv_discrete.

更明确地说,此代码从您使用和Iteration制作的分布中返回随机变量。(尽管我稍微更改了名称,因为我不喜欢使用 sysargs 进行测试)。WindDirFreq

import sys
import scipy.stats
import numpy 
import random

def CDF_Random(probs,Iterations):
    WindDir = [0,45,90,135,180,225,270,315]
    Freq = probs
    mydist = scipy.stats.rv_discrete(name = 'mydistribution', values=(WindDir,Freq))  
    cdf_rand=mydist.rvs(size=Iterations)    
    #cdf=scipy.stats.rv_discrete.cdf(cdf_rand,[.5,1,10,50,99])
    return (cdf_rand)

if __name__ == '__main__':
    probs = [random.randint(1,10) for _ in xrange(8)]
    probs = [float(p)/sum(probs) for p in probs]
    Iterations = 30
    numpy.set_printoptions(threshold=Iterations)
    a=CDF_Random(probs,Iterations)

给出:

>>> a
array([  0, 270, 180, 180,   0, 180,  45,  45, 270, 270, 270,   0,  45,
        45, 180,  45, 180, 180, 270, 225,  45, 180, 270, 315, 225,  45,
       180, 180,   0,   0])

如果您想评估您的发行版的 cdf,请使用mydist.cdf([array of percentiles to evaluate at here])

IE

>>> mydist.cdf([1,10,25,50,75,99])
array([ 0.1627907 ,  0.1627907 ,  0.1627907 ,  0.30232558,  0.30232558,
        0.39534884])

可以在文档中找到更详尽的信息。 以及查看 rv_discrete 实例的文档字符串。即print mydist.__doc__

于 2013-07-15T14:51:20.467 回答