我正在尝试在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 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)
答案 0 :(得分:2)
scipy.stats.rv_discrete.cdf
评估您在某些列出的分位数上的分布情况。你必须先分发你的发行版。尝试:
mydist = scipy.stats.rv_discrete(name = 'mydistribution', values=(WindDir,Freq))
注意:Freq实际上应该是概率并且总和为1,所以你应该将每个成员除以Freq的总和,然后再将其传递给.rv_discrete
。
更明确地说,此代码会从您使用Iteration
和WindDir
的分发中返回Freq
个随机变量。 (虽然我稍微更改了名称,因为我不喜欢使用sysargs进行测试)。
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])
即
>>> mydist.cdf([1,10,25,50,75,99])
array([ 0.1627907 , 0.1627907 , 0.1627907 , 0.30232558, 0.30232558,
0.39534884])
可以在the documentation.找到更全面的信息,以及查看rv_discrete实例的doc字符串。即print mydist.__doc__
。