web-dev-qa-db-ja.com

インデックスのリストでnumpy配列をフィルタリングする方法は?

私はpythonに比較的慣れておらず、numpyとscipyの使い方を学ぼうとしています。LASデータ[x、y、z、強度、分類]で構成されるnumpy配列を持っています。IポイントのcKDTreeを作成し、 query_ball_point を使用して最も近いネイバーを見つけました。query_ball_pointによって返されるネイバーのz値の標準偏差を見つけたいと思います。これは、ポイントとそのインデックスのリストを返します。隣人。

Filtered__rowsをフィルタリングして、query_ball_pointによって返されるリストにインデックスが含まれているポイントのみの配列を作成する方法はありますか?以下のコードを参照してください。リストに値を追加してそこから標準偏差を計算することはできますが、numpyを使用して単一軸の標準偏差を計算する方が簡単だと思います。前もって感謝します。

# Import modules
from liblas import file
import numpy as np
import scipy.spatial

if __name__=="__main__":
    '''Read LAS file and create an array to hold X, Y, Z values'''
    # Get file
    las_file = r"E:\Testing\kd-tree_testing\LE_K20_clipped.las"
    # Read file
    f = file.File(las_file, mode='r')
    # Get number of points from header
    num_points = int(f.__len__())
    # Create empty numpy array
    PointsXYZIC = np.empty(shape=(num_points, 5))
    # Load all LAS points into numpy array
    counter = 0
    for p in f:
        newrow = [p.x, p.y, p.z, p.intensity, p.classification]
        PointsXYZIC[counter] = newrow
        counter += 1

    '''Filter array to include classes 1 and 2'''
    # the values to filter against
    unclassified = 1
    ground = 2
    # Create an array of booleans
    filter_array = np.any([PointsXYZIC[:, 4] == 1, PointsXYZIC[:, 4] == 2], axis=0)
    # Use the booleans to index the original array
    filtered_rows = PointsXYZIC[filter_array]

    '''Create a KD tree structure and segment the point cloud'''
    tree = scipy.spatial.cKDTree(filtered_rows, leafsize=10)

    '''For each point in the point cloud use the KD tree to identify nearest neighbors,
       with a K radius'''
    k = 5 #meters
    for pntIndex in range(len(filtered_rows)):
        neighbor_list = tree.query_ball_point(filtered_rows[pntIndex], k)
        zList = []
        for neighbor in neighbor_list:
            neighbor_z = filtered_rows[neighbor, 2]
            zList.append(neighbor_z)
11
Barbarossa

うーん、何が求められているのかわからない(それはかなりのテキストの壁です)

filter_indices = [1,3,5]
print numpy.array([11,13,155,22,0xff,32,56,88])[filter_indices] 

あなたが求めているものかもしれません

34
Joran Beasley

numpy.take は便利で、多次元配列に適しています。

import numpy as np

filter_indices = [1, 2]
axis = 0
array = np.array([[1, 2, 3, 4, 5], 
                  [10, 20, 30, 40, 50], 
                  [100, 200, 300, 400, 500]])

print(np.take(array, filter_indices, axis))
# [[ 10  20  30  40  50]
#  [100 200 300 400 500]]

axis = 1
print(np.take(array, filter_indices, axis))
# [[  2   3]
#  [ 20  30]
# [200 300]]
5
gnuchoi

それが多次元配列にどのように変換されるか知っていますか?

すべてのインデックスに1次元配列を指定することで、多次元配列に拡張できます。したがって、2次元配列の場合はfilter_indices=np.array([[1,0],[0,1]]) array=np.array([[0,1],[1,2]]) print(array[filter_indices[:,0],filter_indices[:,1])

あなたに与えるでしょう:[1,1]

Scipyには、呼び出した場合に何が起こるかについての説明があります:print(array[filter_indices])

https://docs.scipy.org/doc/numpy-1.13.0/user/basics.indexing.html

1
Leaderchicken