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

在最后一行中,我尝试创建一个新数组:PDCFluxrange它由数组的值组成PDCFluxfreq频率)在:log10(4*(10**(-5)))和之间log10(4*(10**(-7))

当我在 Pylab 中运行程序时,我收到类似于以下内容的错误消息:Value Error: The truth value of an array with more than one element is ambiguous. 使用a.any()a.all()

在这种情况下,我不确定如何在我的代码中正确使用这两个函数中的任何一个而不创建循环或定义新函数;我认为可能有更简单的方法来完成同样的事情。

4

2 回答 2

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

每个条件 (a > 2a < 8) 都在创建一个布尔 numpy 数组,该数组的长度等于a,并且在 中的每个位置包含您的标准的真值a

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

然后,您使用numpy.logical_and来查找两个条件都为真的位置。

最后,您将结果数组用作布尔或“掩码”索引数组,以仅从原始数组中检索满足您的条件的元素。

认为你得到了ValueError因为 whilea > 2是有效的(实际上只是在 call a.__gt__(2),像2 < a < 8is first call这样的语句cmp(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 回答