3
import os
import pyfits as ps
import lomb
import numpy as np
import matplotlib.pyplot as plt

hdulist = ps.open('filename')

tbdata = hdulist[1].data

PDCFlux = tbdata.field(7)
PDCFlux = PDCFlux[~np.isnan(PDCFlux)]

psd,freq = lomb.lomb(Timesec,PDCFlux)
logpsd = np.log10(psd)
logfreq = np.log10(freq)

#want an associated 'slope'.

'''PDC Slope'''
PDCFluxrange = PDCFlux.all[np.log10(4*(10**(-5)))<freq<np.log10(4*(10**(-7)))]

最後の行で、新しい array: を作成しようとしました。これは、(frequency) between:とPDCFluxrangeの配列の値で構成されます。PDCFluxfreqlog10(4*(10**(-5)))log10(4*(10**(-7))

Pylab でプログラムを実行すると、次のようなエラー メッセージが表示されますValue Error: The truth value of an array with more than one element is ambiguousa.any()またはを使用しa.all()ます。

その場合、ループを作成したり、新しい関数を定義したりせずに、コードでこれら 2 つの関数のいずれかを適切に使用する方法がわかりません。同じことを達成するためのより簡単な方法があるかもしれないと思います。

4

2 に答える 2

6
>>> import numpy as np
>>> a = np.arange(10)
>>> a[(a > 2) & (a < 8)]
array([3, 4, 5, 6, 7])

各条件(a > 2およびa < 8)は、長さが、に等しく、aの各位置での基準の真理値を含むブール値のnumpy配列を作成していますa

   >>> a > 2
   array([False, False, False,  True,  True,  True,  True,  True,  True,  True], dtype=bool)

次に、numpy.logical_andを使用して、両方の条件が真になる位置を見つけます。

最後に、結果の配列をブール値または「マスク」インデックス配列として使用して、元の配列から基準を満たす要素のみを取得します。

whileが有効であるため、取得していると思います(実際には、を呼び出しているだけですが、のようなステートメントが最初に呼び出されます。これにより、同じ結果になります。ValueErrora > 2a.__gt__(2)2 < a < 8cmp(2,a)ValueError

>>> a = np.arange(10)
>>> cmp(2,a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
于 2012-10-15T18:18:06.043 に答える
0

私はあなたが欲しいと思います

PDCFluxrange = [x for x in PDCFlux if x>np.log10(4*(10**(-5))) and x<np.log10(4*(10**(-7)))]

それはあなたのために働きますか?私はあなたのコードを正しく理解していることを願っています。

于 2012-10-15T18:17:33.250 に答える