The*_*tor 1 python fits pyfits
我有一个包含许多列的FITS文件.该文件的简化示例的一部分如下所示:
A B C
100 1 90
100 2 90
100 3 90
100 4 90
211 40 70
211 41 70
211 42 70
211 43 70
211 44 70
Run Code Online (Sandbox Code Playgroud)
如果您注意到这里,A列和C列的前四行是相同的,但B列的变化范围是1到4.然后A列和C列的下5个值相同,但B列的变化范围是40到44.
我想做的是,写一个程序,创建一个这样的文件:
A B C
100 4 90
211 5 70
Run Code Online (Sandbox Code Playgroud)
也就是说,B列应包含A列和C列相同的值的数量!
我想知道在Python中如何做到这一点.它不一定需要处理FITS文件,如果有一些例程无法在FITS文件中使用,我也可以将其转换为ASCII格式.
到目前为止我尝试了什么:
我遇到了一个被调用的例程Collections,它有一个子例程,它调用Counter列表中相等的值并返回它们.
我试过了:
import collections
counter = collections.Counter(a)
counts = counter.values()
Run Code Online (Sandbox Code Playgroud)
但这只能给我A列中相同的值.有人能告诉我如何使用这个例程将这些值与C列进行比较吗?
我会选择这样的东西......:
from itertools import groupby
from operator import itemgetter
with open('input') as fin, open('output', 'w') as fout:
fout.write(next(fin, ''))
rows = (line.split() for line in fin)
for k, g in groupby(rows, itemgetter(0, 2)):
fout.write('{} {} {}\n'.format(k[0], sum(1 for _ in g), k[1]))
Run Code Online (Sandbox Code Playgroud)
itertools.groupby于GROUPBY第一和第三列g以获取组的长度您也可以使用collections.Counter如果组是非连续的并且应该计为一个,您可以groupby使用以下内容替换:
counts = Counter((row[0], row[2]) for row in rows)
for k, v in counts.iteritems():
fout.write('{} {} {}\n'.format(k[0], v, k[1]) # or even...
# print >> fout, k[0], v, k[1]
Run Code Online (Sandbox Code Playgroud)