在Python中:给定一个原始数字数组,如何创建一个新的数组,其中包含原始数组中在特定范围内的值?

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,该数组由PDCFlux数组的freq(频率)值组成,该值介于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()
在这种情况下,我不确定如何在没有创建循环或定义新函数的情况下正确使用这两个函数中的任何一个;我认为可能有一种更简单的方法来完成相同的事情。

3
你应该简化你的代码以便更好地回答你的问题。但如果你简化了,很可能会找到答案。 - none
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中每个位置上的准则的真值。请保留HTML标签。
   >>> a > 2
   array([False, False, False,  True,  True,  True,  True,  True,  True,  True], dtype=bool)

然后,您使用numpy.logical_and查找两个条件都为真的位置。
最后,您将结果数组用作boolean or "mask" index array,以仅检索满足您的条件的原始数组元素。
我认为您会收到ValueError,因为a>2是有效的(实际上只是调用a.__gt__(2)),但像2
>>> 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()

“and”语句是我遗漏的部分。这样就清楚明了。 - user1747807

0

我认为你想要的是

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

这对你有用吗?我希望我正确理解了你的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接