2

* .las形式のファイルがあり、Return1、Return2、...、Return5のポイント数を数えたいのですが、If ... Elseステートメントを使用していますが、もっとエレガントでコードの保存。ヘルプとヒントを事前に感謝します。

    Return1 = 0
    Return2 = 0
    Return3 = 0
    Return4 = 0
    Return5 = 0
    count = 0
    for p in lasfile.File(inFile,None,'r'):
        count +=1
        if p.return_number == 1:
            Return1 += 1
        elif p.return_number == 2:
            Return2 += 1
        elif p.return_number == 3:
            Return3 += 1
        elif p.return_number == 4:
            Return4 += 1
        elif p.return_number == 5:
            Return5 += 1
4

3 に答える 3

4

のカウンターを使用できdictます(この場合はリストにすることもできます)。defaultdict非常に便利です:

from collections import defaultdict
returns = defaultdict(int)
count = 0
for p in lasfile.File(inFile, None, 'r'):
    count += 1
    returns[p.return_number] += 1

編集: DSMが例を含む別の回答を投稿しているかどうかわからないのでCounter、ここでOPの質問に回答します。

@DSM:カウンターを組み合わせることができますか?例:p.return_numberとp.scan_angleを同時にカウントしたい場合– Gianni

Counterあなたがそれを与える反復可能な値を数えます。iterableはホモジェニックであると想定されています。たとえば、 sが、などscan_angleの値をとることができる場合、両方に同じ値を使用して正しい結果を得ることができません。値が重ならない場合、正しい結果を得ることができますが、コードは混乱し、理解しにくくなります。2つの'を使用することをお勧めします。1つはs用、もう1つは's用です。同じループを使用して両方を簡単に入力できます(同じは'を表します)が、2つの'の作成と入力を1つのステートメントに圧縮する場合は、次のようなものが必要になります。12CounterCounterreturn_numberscan_angledefaultdictCounter

from collections import Counter
rnc, sac = map(Counter, 
  zip(*((p.return_number, p.scan_angle) for p in lasfile.File(inFile,None,'r'))))

少なくともPython2ではリストが生成されるため、ある時点ですべてのデータが一度にメモリに保持されることに注意してください。

それでも、はるかに簡単な方法は次のとおりです。

  • 2つのを使用しますdefaultdict

    returns, angles = defaultdict(int), defaultdict(int)
    for p in lasfile.File(inFile, None, 'r'):
         returns[p.return_number] += 1
         angles[p.scan_angle] += 1
         count += 1
    
  • またはCounter、ファイルの2つの異なる読み取りに2つ入力します。

    fp = lasfile.File(inFile, None, 'r')
    returns = Counter(p.return_number for p in fp)
    fp = lasfile.File(inFile, None, 'r')
    angles = Counter(p.scan_angle for p in fp)
    
于 2012-11-09T18:04:23.513 に答える
3

辞書を使う:

return_counts = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0}
count = 0
for p in lasfile.File(inFile,None,'r'):
    count +=1
    if 1 <= p.return_number <= 5:
        return_counts[p.return_number] += 1
于 2012-11-09T18:02:21.453 に答える
2

p.return_numberそれが1-5の範囲にあると仮定します

Return = [0, 0, 0, 0, 0]
for p in lasfile.File(inFile,None,'r'):
    Return[p.return_number-1] += 1
于 2012-11-09T18:04:00.107 に答える