问题
I am relatively new to python and have been trying to learn how to use numpy and scipy. I have a numpy array comprised of LAS data [x, y, z, intensity, classification]. I have created a cKDTree of points and have found nearest neighbors using query_ball_point. I would like to find standard deviation of the z values for the neighbors returned by query_ball_point, which returns a list of indices for the point and its neighbors.
Is there a way to filter filtered__rows to create an array of only points whose index is in the list returned by query_ball_point? See code below. I can append the values to a list and calculate std dev from that, but I think it would be easier to use numpy to calculate std dev on a single axis. Thanks in advance.
# 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)
回答1:
ummmm Its hard to tell whats being asked (thats quite the wall of text)
filter_indices = [1,3,5]
print numpy.array([11,13,155,22,0xff,32,56,88])[filter_indices]
may be what you are asking
回答2:
Do you know how that translates for multi-dimensional arrays?
It can be expanded to multi dimensional arrays by giving a 1d array for every index so for a 2d array
filter_indices=np.array([[1,0],[0,1]])
array=np.array([[0,1],[1,2]])
print(array[filter_indices[:,0],filter_indices[:,1])
will give you : [1,1]
Scipy has an explanation on what will happen if you call:
print(array[filter_indices])
https://docs.scipy.org/doc/numpy-1.13.0/user/basics.indexing.html
回答3:
numpy.take can be useful and works well for multimensional arrays.
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]]
来源:https://stackoverflow.com/questions/19821425/how-to-filter-numpy-array-by-list-of-indices