2017-10-20 15 views
1

これは単純な解決策では簡単な問題のように読んでいるが、私はその周りを頭で囲むことができない。laspyによって作成されたnumpy配列を並べ替え

laspyのドキュメントは少し疎ですが、これまでよく管理しています。私は、ここの問題は単にnumpyで十分に精通していないと思う。

私は、GPS時間に基づいて小数点以下の配列をソートする必要があります。私はテストのためにlaspyが付属していますsample.lasを使用しています

:ここ

は私が立つところです。

import laspy 
import numpy as np 

#open the file 
lasFile = laspy.file.File("C:/Anaconda3/Lib/site-packages/laspytest/data/simple.las", mode = "rw") 

#put points in numpy array 
lasPoints = lasFile.points 

私がしようとしているのは、配列をgps_time列で並べ替えることです。

print(lasPoints.dtype) 

は私が

を実行することができgps_timeにアクセスするには、私に

[ ((63701224, 84902831, 43166, 143, 73, 1, -9, 132, 7326, 245380.78254963, 68, 77, 88),) 
((63689633, 84908770, 44639, 18, 81, 1, -11, 128, 7326, 245381.45279924, 54, 66, 68),) 
((63678474, 84910666, 42671, 118, 9, 1, -10, 122, 7326, 245382.13595007, 112, 97, 114),) 
..., 
((63750167, 85337575, 41752, 43, 9, 1, 11, 124, 7334, 249772.21013494, 100, 96, 120),) 
((63743327, 85323084, 42408, 31, 9, 1, 11, 125, 7334, 249772.70733372, 176, 138, 164),) 
((63734285, 85324032, 42392, 116, 73, 1, 9, 124, 7334, 249773.20172407, 138, 107, 136),)] 

を与えてくれ

[('point', [('X', '<i4'), ('Y', '<i4'), ('Z', '<i4'), ('intensity', '<u2'), ('flag_byte', 'u1'), ('raw_classification', 'u1'), ('scan_angle_rank', 'i1'), ('user_data', 'u1'), ('pt_src_id', '<u2'), ('gps_time', '<f8'), ('red', '<u2'), ('green', '<u2'), ('blue', '<u2')])] 

print(lasPoints) 

を与えます

lasPoints[0][0][9] ## first gps_time in array 
lasPoints[1][0][9] ## second gps_time in array 

"gps_time"を9に置き換えても同じ結果が得られます。

私は私のデータをソートしようとしに来たときに今、実際には何を並べ替えていないようだ。

np.sort(lasPoints["point"]["gps_time"]) 
print(lasPoints) 

配列はソートされていないとそのまま、

lasPoints=np.sort(lasPoints["point"]["gps_time"]) 
print(lasPoints) 

結果をプリントアウトされますgps_timeは次のようにソートされています:

[ 245370.41706456 245370.74331403 245371.06452222 ..., 249782.07498673 
    249782.64531958 249783.16215837] 

ここで私は間違っていますか?

答えて

2

ドキュメントを理解する限り、np.sortはインプレースソートをサポートしていないようです。しかし、np.ndarray.sort です。 したがって

np.sort(lasPoints["point"]["gps_time"]) 
print(lasPoints) 

は常にソートされません。

しかしあなたの問題: リストからGPSタイムのリストをスライスして、ソートされたリストのインデックスを得るためにargsortを使うことができます。 これらはあなたのlaspointをソートするのに使用できます。 は、例えば:

sorted_ind = np.argsort(list_of_gpstimes) 
laspoints = laspoints[sorted_ind] 
+1

スポットをソートします。 np.ndarray.sort(point_records ["point"] ["gps_time"])は必要に応じて配列をソートします。 – Ingwe

1

ただ、完全にこれを閉じてNPを使用して、dudaklの答えに構築すること。ndarray、ソート、これは私のために働いていたものです:ここ

np.ndarray.sort(lasPoints["point"],kind='mergesort',order='gps_time') 

キーは[「ポイント」] lasPointを指定することだったし、その後gps_timeで注文します。

ここでこれが唯一の歓声メイト、上gps_timeのcoloumn何もない

np.ndarray.sort(lasPoints["point"]["gps_time]) 
関連する問題