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将计算你给它的迭代中的值。迭代应该是同质的。例如,如果scan_angles 可以采用 、 等值12那么您不能Counter对两者都使用相同的值并获得正确的结果。如果这些值不重叠,您可以获得正确的结果,但您的代码将令人困惑且难以理解。我建议使用两个Counter's:一个用于return_numbers,一个用于scan_angle's。您可以使用相同的循环轻松地填充两者(并且相同的代表defaultdict's),但如果您想将创建和填充两个Counter's 压缩到一个语句中,您将需要类似

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

请注意,至少在 Python 2 上它会生成一个列表,因此所有数据将在某个时间点同时保存在内存中。

然而,更简单的方法是:

  • 使用两个defaultdicts:

    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或在文件的两个不同读取中填充两个s:

    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 回答