2

emcee という Python モジュールを使用してディストリビューションをサンプリングしています。以下の関数に呼び出される (37,100) (それぞれ Ntrig と Nsamp という名前を付けた) 配列を渡す必要がありeventsます。

def mp(SNR2, *events):
    events = np.asarray(events).reshape((Ntrig,Nsamp))
    bessel = special.iv(0,np.sqrt(x*SNR2(event)))
    exp = np.exp(-0.5*(x+SNR2(event)))
    I = integrate.quad(lambda x: exp*bessel,0,SNRth**2)[0]
    return np.asarray([np.array[I for event in events[i]] for i in range(len(events))]).reshape(events.shape)

エラーが発生し続けます:

ValueError: total size of new array must be unchanged

私が理解*eventsしているように、events配列を 37*100 個の個別の引数に分割します。配列を再形成する次の行では、配列を 37 x 100 の配列に戻すべきではありませんか?

PSなぜわざわざevents個別の引数に分割するのかと尋ねる前に、モジュールが機能するためにこれが必要であり、配列を取ることはできません。

完全なトレースバック エラー:

ValueError                                Traceback (most recent call last)
<ipython-input-17-c8e815326a69> in <module>()
----> 1 mp(SNR2,events)

<ipython-input-16-9f73f234c628> in mp(SNR2, *events)
      5 def mp(SNR2, *events):
      6     events = np.asarray(events).reshape((Ntrig,Nsamp))
----> 7     return np.asarray([np.array([integrate.quad(lambda x: np.exp(-0.5*(x+SNR2(event)))*special.iv(0,np.sqrt(x*SNR2(event))),0,SNRth**2)[0] for event in events[i]]) for i in range(len(events))]).reshape(events.shape)
      8 #    return integrate.quad(lambda x: 0.5*np.exp(-0.5*(x+SNR2(event)))*special.iv(0,np.sqrt(x*SNR2(event))),0,SNRth**2)[0]
      9 def pp(SNR2, *events):

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/integrate/quadpack.pyc in quad(func, a, b, args, full_output, epsabs, epsrel, limit, points, weight, wvar, wopts, maxp1, limlst)
    279         args = (args,)
    280     if (weight is None):
--> 281         retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points)
    282     else:
    283         retval = _quad_weight(func,a,b,args,full_output,epsabs,epsrel,limlst,limit,maxp1,weight,wvar,wopts)

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/integrate/quadpack.pyc in _quad(func, a, b, args, full_output, epsabs, epsrel, limit, points)
    343     if points is None:
    344         if infbounds == 0:
--> 345             return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
    346         else:
    347             return _quadpack._qagie(func,bound,infbounds,args,full_output,epsabs,epsrel,limit)

<ipython-input-16-9f73f234c628> in <lambda>(x)
      5 def mp(SNR2, *events):
      6     events = np.asarray(events).reshape((Ntrig,Nsamp))
----> 7     return np.asarray([np.array([integrate.quad(lambda x: np.exp(-0.5*(x+SNR2(event)))*special.iv(0,np.sqrt(x*SNR2(event))),0,SNRth**2)[0] for event in events[i]]) for i in range(len(events))]).reshape(events.shape)
      8 #    return integrate.quad(lambda x: 0.5*np.exp(-0.5*(x+SNR2(event)))*special.iv(0,np.sqrt(x*SNR2(event))),0,SNRth**2)[0]
      9 def pp(SNR2, *events):

<ipython-input-16-9f73f234c628> in SNR2(*events)
      1 def SNR2(*events):
----> 2     events = np.asarray(events).reshape((Ntrig,Nsamp))
      3     C = 5*np.pi**(-1.33333)*events**(1.66667)/(96*d**2)
      4     return C*integrate.quad(lambda f: f**(-2.3333)/S(f), 20, 1500, limit=1000)[0]
      5 def mp(SNR2, *events):

ValueError: total size of new array must be unchanged
4

1 に答える 1

3

私が理解eventsしているように、イベント配列を 37*100 の個別の引数に分割します。

本当じゃない。mpを使用して呼び出す場合

mp(SNR2, events)

の内部mpは、events1 要素のタプル になります(arr,)。ここarrで、 は (37, 100) 形状の配列です。

mpを使用して呼び出す場合

mp(SNR2, *events)

の内部mpevents37 要素のタプルになります。ここで、37 要素は (37, 100) 形状の配列の 37 行です。

mpを使用して呼び出す場合

mp(SNR2, *events.flat)

の内部mpは、events37*100 要素のタプルになります。


トレースバックの最後のスタンザに次のように記載されていることに注意してください。

<ipython-input-16-9f73f234c628> in SNR2(*events)
      1 def SNR2(*events):
----> 2     events = np.asarray(events).reshape((Ntrig,Nsamp))
      3     C = 5*np.pi**(-1.33333)*events**(1.66667)/(96*d**2)
      4     return C*integrate.quad(lambda f: f**(-2.3333)/S(f), 20, 1500, limit=1000)[0]
      5 def mp(SNR2, *events):

ValueError: total size of new array must be unchanged

そのため、Python がSNR2関数内にあるときにエラーが発生します。

はusingでSNR2呼び出され、( 37,100 ) 形状の配列であるため、変数 inは元の配列を含む 1 要素のタプルです。それはあなたが望むものではありません。mpSNR2(event)eventeventSNR2

コードを修正する最も簡単な方法は、定義することです

def SNR2(events):  
    # no longer needed
    # events = np.asarray(events).reshape((Ntrig,Nsamp))

期待どおりにイベントを渡すだけです。

ただし、 の署名を変更できない場合はSNR2、次のように呼び出す必要があります。

SNR2(*event.flat)

mp関数内。


参照:アンパック演算子の優れた説明と、*関数を定義して関数を呼び出すときに構文がどのように使用されるかについて説明します。

于 2014-07-23T18:52:19.343 に答える