我有this table,每个能量通道中有一个事件的光子数。
第三列是频道的分组:标有-1
的所有频道都被分组到一个单一频道,其来源位于之前的1
分组值。也就是说,在此示例中,从0到39的所有通道都被分组到一个通道中。
如何使用group
列定义的分组创建数组或计数列表?
在这个例子中,我得到的数组将有两个元素,一个是通道0到39的计数总和,另一个是第40个通道中计数的元素。
对不起,我无法提供任何启动代码,但我真的不知道如何开始。任何建议真的很感激。
编辑:该表是FITS文件的一部分。我使用pyfits
:
import pyfits
data = pyfits.open('./file.fits')
chan = data[1].data.field('channel')
counts = data[1].data.field('counts')
groups = data[1].data.field('grouping')
data.close()
print type(chan)
返回<type 'numpy.ndarray'>
。其他数组也一样。
答案 0 :(得分:2)
尝试一下,
chan = np.array( [0,1,2,3,4,5,6,7,8,9] )
counts = np.array( [0.,0.,5.,2.,0.,0.,1.,1.,1.,0.] )
groups = np.array( [1,-1,-1,-1,-1,1,-1,-1,-1,-1] )
indx = np.where( groups==1 )
# indx is a tuple with one entry for each dimension of the array groups
# in the next statement I just grab the first (and only) element of the tuple
indx = indx[0]
# next we split the array based on those indices
counts = np.split( counts, indx )
# counts is now a list of arrays
# [array([], dtype=float64), array([ 0., 0., 5., 0., 0.]),array([ 0., 1., 1., 1., 0.])]
# I use the if statement in the list comprehension to get rid of the first empty array
totals = np.array( [sum(c) for c in counts if len(c)>0] )
tchnls = np.split( chan, indx )[1:]
然后totals
将是每个组的计数总和,
>>> totals
array([ 7., 3.])
和tchnls将是为每个小组做出贡献的渠道,
>>> tchnls
[array([0, 1, 2, 3, 4]), array([5, 6, 7, 8, 9])]