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ます。上記のコードに示すように、配列である場合もあれば、1 つの整数である場合もあれば、両方が 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 を編集した後

デフ 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' がありません

デフ 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'

また、たとえば配列を最初の変数として、整数と浮動小数点数を 2 番目の変数として使用するなど、他の組み合わせも試しました。

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])

分布の累積分布関数を評価する場合は、次を使用します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])

詳細については、ドキュメントを参照してください。 rv_discrete インスタンスのドキュメント文字列を見るだけでなく。すなわちprint mydist.__doc__

于 2013-07-15T14:51:20.467 に答える