1

多くの列を含む 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

ここで気が付くと、列A と Cの最初の 4 行は同じですが、列Bは 1 から 4 まで変化します。次に、列A と Cの次の 5 つの値は同じですが、列Bは 40 から 44 まで変化します。

私がやりたいことは、次のようなファイルを作成するプログラムを書くことです:

   A      B     C
  100     4     90
  211     5     70

つまり、列 B には、列 A と C が同じ値の数が含まれている必要があります。

Pythonでこれを行う方法を知りたいです。必ずしも FITS ファイルを扱う必要はありません。FITS ファイルで使用できないルーチンがいくつかある場合は、ASCII 形式に変換することもできます。

私がこれまでに試したこと:

リスト内の等しい値の数をカウントし、それらを返すCollectionsサブルーチンが呼び出されたルーチンにぶつかりました。Counter

私は試した:

import collections
counter = collections.Counter(a)
counts = counter.values()

しかし、これは列Aの値が等しいだけです。このルーチンを使用して、これらの値を列Cと比較する方法も教えてもらえますか?

4

4 に答える 4

5

私はこのようなものに行きます...:

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]))
  • ヘッダーをまっすぐに書く...
  • 空白で分割された行を生成するジェネレータを構築する
  • itertools.groupby1 番目と 3 番目の列でグループ化するために使用します
  • gグループの長さを取得するために出現回数を数えます
  • 必要に応じて書式設定された行を書き出します...

collections.Counterグループが連続しておらず、1 つとしてカウントする必要がある場合は、a を使用することもできます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] 
于 2014-06-29T12:48:17.047 に答える
0

質問にコードを追加して、何を試したかを示す必要があります。私も含めて、あなたが試したことがわからない場合、人々はあまり助けたくありません。

ロジックのヒントとして(基本。これを行うにはもっときちんとした方法があります):

列 A と列 C の数字で構成されるキーを持つ辞書を作成してみてください。次に、A と C が同じ場合は常に、辞書でその組み合わせのキーを検索し、見つかった場合は値に 1 を追加し、見つからなかった場合は新しい要素を追加します。

あなたの例を使用して(疑似コードで-何かすることがあります:P)

if "100-90" in array:  // Checking if the element is in the array
  array["100-90"] += 1  // Adds one to an existing element
else
  array["100-90] = 1  // Adds a new element into array
于 2014-06-29T11:48:22.150 に答える
0

これを試して:

lines = """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""".split("\n")

count = 0
oldA = oldB = oldC = None
for line in lines:

    a,b,c = line.split(" ")
    if None in [oldA, oldB, oldC]:
        oldA,oldB,oldC = a,b,c

    if oldA == a and oldC == c:
        count +=1

    else:
        print oldA,count,oldC
        count = 1
        oldA, oldB, oldC = a,b,c

print oldA,count,oldC
于 2014-06-29T12:08:05.213 に答える