1

最近、リスト内包表記を使用することの大きな利点を理解しています。特殊な形式の *.las ファイルに保存されている数百万のポイント (x、y、z) を使用しています。Python では、この形式を使用する方法が 2 つあります。

Liblas module  [http://www.liblas.org/tutorial/python.html][1] (in a C++/Python)
laspy module [http://laspy.readthedocs.org/en/latest/tut_part_1.html][2] (pure Python)

liblas にいくつか問題があり、laspy をテストしたいと考えています。

liblas では、次のようにリスト内包表記を使用できます。

from liblas import file as lasfile
f = lasfile.File(inFile,None,'r') # open LAS
points = [(p.x,p.y) for p in f] # read in list comprehension

laspy では、同じことを行う方法を理解できません。

from laspy.file import File
f = file.File(inFile, mode='r')
f
<laspy.file.File object at 0x0000000013939080>
(f[0].X,f[0].Y)
(30839973, 696447860)

私は次のようにいくつかの組み合わせを試しました:

points = [(p.X,p.Y) for p in f]

しかし、私はこのメッセージを受け取ります

Traceback (most recent call last):
 File "<interactive input>", line 1, in <module>
AttributeError: Point instance has no attribute 'x'

Python では大文字と小文字が区別されるため、大文字と非大文字で試しました。

>>> [(p.x,p.y) for p in f]
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
AttributeError: Point instance has no attribute 'x'
>>> [(p.X,p.Y) for p in f]
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
AttributeError: Point instance has no attribute 'X'

これは対話型プロンプトです:

C:\Python27>python.exe
Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> from laspy.file import File
>>> inFile="C:\\04-las_clip_inside_area\\Ku_018_class.las"
>>> f = File(inFile, None, 'r')
>>> f
<laspy.file.File object at 0x00000000024D5E10>
>>> points = [(p.X,p.Y) for p in f]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Point instance has no attribute 'X'
>>>

リストの後の print p は次のとおりです。

print dir(p) 
['__doc__', '__init__', '__module__', 'make_nice', 'pack', 'packer', 'reader', 'unpacked']

ループ形式では、常に同じエラーが発生します

>>> for p in f:
...     print dir(p)
...     print p.X,p.Y
...     
['__doc__', '__init__', '__module__', 'make_nice', 'pack', 'packer', 'reader', 'unpacked']
Traceback (most recent call last):
  File "<interactive input>", line 3, in <module>
AttributeError: Point instance has no attribute 'X'

nneonneo によって提案されたこのコードを使用して

import numpy as np
for p in f:
...   points = np.array([f.X, f.Y]).T  

配列に格納できます

points
array([[ 30839973, 696447860],
       [ 30839937, 696447890],
       [ 30839842, 696447832],
       ..., 
       [ 30943795, 695999984],
       [ 30943695, 695999922],
       [ 30943960, 695999995]])

しかし、リスト内包表記を作成する方法がありません

points = [np.array(p.X,p.Y).T for p in f]
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
AttributeError: Point instance has no attribute 'X'

助けてくれてありがとう。ジャンニ

4

3 に答える 3

3

Python では大文字と小文字が区別されます。属性を要求しているように見えますxが、大文字にする必要がありますX

于 2012-10-09T18:01:57.567 に答える
1

試す

import numpy as np
...
points = np.array([f.X, f.Y]).T
于 2012-10-09T18:26:42.600 に答える
1

より多くの属性を表示させるメソッドがあるPointようです。make_nice()

for p in f: p.make_nice()

これで、リスト構成が機能するはずです (大文字の X と Y を使用します。以下のコメントを参照してください)。

[(p.X,p.Y) for p in f]

注: この回答はテストされていません。のソースを読むことに基づいていlaspy.util.Pointます。

関連ソース:

def make_nice(self):
    '''Turn a point instance with the bare essentials (an unpacked list of data)
    into a fully populated point. Add all the named attributes it possesses, 
    including binary fields.
    '''
    i = 0
    for dim in self.reader.point_format.specs: 
            self.__dict__[dim.name] = self.unpacked[i]
            i += 1

    # rest of method snipped
于 2012-10-09T18:27:38.613 に答える