我有两个FITS文件。让我们考虑例如第一个文件有100行和2列。第二个文件有1000行和2列。
FITS FILE 1 FITS FILE 2
A B C D
1 2 1 2
1 3 1 2
2 4 1 2
我需要取第一个文件的第一行,即1和2,并检查第二个文件中有多少行有1和2. 在我们的示例中,我们有3个第二个文件中有1和2的行。我需要对第二行(第一个文件)执行相同的操作,即1和3,并找出第二个文件中有多少行有1和3等等上。
第一个文件没有重复项(所有行都有不同的对,没有一个是相同的,只有文件2有很多相同的对,我需要找到它们。)
我最终需要第二个文件中的行数与第一个FITS文件的行具有相似的值。
所以最后它会是:
A B Number
1 2 3 # 1 and 2 occurs 3 times
1 3 5 # 1 and 3 occurs 5 times
等等。
我知道我需要遍历列表并获得答案。我知道zip
将获取第一个文件的行,但我找不到使用这些值进行迭代的方法。
到目前为止,我一直尝试做的是使用zip
以某种方式实现它:
for i,j in zip(A,B):
for m,n in zip(C,D):
使用for i,j in zip(A,B):
我将i,j
作为第一个文件的第一行,依此类推。所以我可以将它与第二个文件进行比较。
答案 0 :(得分:4)
你几乎就在那里。您只需要Counter
来计算每行在第二个文件中出现的次数。
from collections import Counter
# Create frequency table of (C,D) column pairs
file2freq = Counter(zip(C,D))
# Look up frequency value for each row of file 1
for a,b in zip(A,B):
# and print out the row and frequency data.
print a,b,file2freq[a,b]
那就是它!只有四行非常简单的代码。
如果您没有collections.Counter
,则可以使用defaultdict
进行模拟:
from collections import defaultdict
file2freq = defaultdict(int)
for c,d in zip(C,D):
file2freq[c,d] += 1
for a,b in zip(A,B):
print a,b,file2freq[a,b]
答案 1 :(得分:0)
答案 2 :(得分:0)
这可能会有所帮助。请参阅评论以了解。
import numpy as np
from collections import Counter
A = np.array([1,1,2,4])
B = np.array([2,3,4,5])
C = np.array([1,1,1,1,2,1,1])
D = np.array([2,2,2,3,4,4,3])
dict1 = Counter(zip(C,D)) # made a dictionary of occurrences of results of zipping C an D
#print dict1 #just uncomment this line to understand what Counter do.
print("A B : Rowcount")
for i in zip(A,B):
print (str(i[0]) + " " + str(i[1]) + " : " + str(dict1[i]))
输出:
A B : Rowcount
1 2 : 3
1 3 : 2
2 4 : 1
4 5 : 0
答案 3 :(得分:0)
熊猫可能对这类事情很有用。这个例子从头开始构造两个Pandas DataFrame
,但应该可以在DataFrame
中包装FITS表(我认为这将是一个单独的问题)。要使用帖子中的示例:
>>> import pandas
>>> table1 = pandas.DataFrame({'A': [1, 1, 2], 'B': [2, 3, 4]})
>>> table2 = pandas.DataFrame({'C': [1, 1, 1], 'D': [2, 2, 2]})
>>> table1
A B
0 1 2
1 1 3
2 2 4
>>> table2
C D
0 1 2
1 1 2
2 1 2
现在有几种方法可以解决这个问题。实际上,所述的问题有点含糊不清。你想要所有 table2中与table1匹配的行吗?或者你可以从table2中排除重复项吗?你可以这样做:
>>> m = pandas.merge(table1, table2, left_on=('A', 'B'), right_on=('C', 'D'), how='inner')
>>> m
A B C D
0 1 2 1 2
1 1 2 1 2
2 1 2 1 2
>>> m.drop_duplicates()
A B C D
0 1 2 1 2
基本上,这将为您提供两个表之间通用的所有行。
答案 4 :(得分:-1)
def read_from_file(filename):
with open(filename, 'r') as f:
data = f.read()
return data
def parse_data(data):
parsed_data = []
for line in data.split('\n'):
line_striped = line.strip() # remove spaces on left and right site
try:
left, right = line_striped.split(' ', 1) # split on first space
except ValueError:
continue
right = right.strip() # remove spaces on left site from right
parsed_data.append((left, right))
return parsed_data
f1_data = read_from_file("file1.txt")
f2_data = read_from_file("file2.txt")
f1_pdata = parse_data(f1_data)
f2_pdata = parse_data(f2_data)
# compare
for f2_item in f2_pdata:
for f1_item in f1_pdata:
if f2_item == f1_item:
print f2_item, "occures in file2 and file1"