我有一个 numpy 数组,filtered__rows
由 LAS 数据组成[x, y, z, intensity, classification]
。我创建了一个cKDTree
点并找到了最近的邻居,query_ball_point
这是该点及其邻居的索引列表。
有没有办法过滤filtered__rows
以创建一个仅包含索引在返回的列表中的点的数组query_ball_point
?
我有一个 numpy 数组,filtered__rows
由 LAS 数据组成[x, y, z, intensity, classification]
。我创建了一个cKDTree
点并找到了最近的邻居,query_ball_point
这是该点及其邻居的索引列表。
有没有办法过滤filtered__rows
以创建一个仅包含索引在返回的列表中的点的数组query_ball_point
?
看起来您只需要一个基本的整数数组索引:
filter_indices = [1,3,5]
np.array([11,13,155,22,0xff,32,56,88])[filter_indices]
numpy.take
对多维数组很有用并且效果很好。
import numpy as np
filter_indices = [1, 2]
array = np.array([[1, 2, 3, 4, 5],
[10, 20, 30, 40, 50],
[100, 200, 300, 400, 500]])
axis = 0
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 : //docs.scipy.org/doc/numpy-1.13.0/user/basics.indexing.html 以下实现应该适用于某些 numpy ndarray 的任意数量的维度/形状。
首先,我们需要一组多维索引和一些示例数据:
import numpy as np
y = np.arange(35).reshape(5,7)
print(y)
indexlist = [[0,1], [0,2], [3,3]]
print ('indexlist:', indexlist)
要实际提取直观的结果,诀窍是使用转置:
indexlisttranspose = np.array(indexlist).T.tolist()
print ('indexlist.T:', indexlisttranspose)
print ('y[indexlist.T]:', y[ tuple(indexlisttranspose) ])
进行以下终端输出:
y: [[ 0 1 2 3 4 5 6] [ 7 8 9 10 11 12 13] [14 15 16 17 18 19 20] [21 22 23 24 25 26 27] [28 29 30 31 32 33 34]] indexlist: [[0, 1], [0, 2], [3, 3]] indexlist.T: [[0, 0, 3], [1, 2, 3]] y[indexlist.T]: [ 1 2 24]
元组...修复了我们可能会导致的未来警告:
print ('y[indexlist.T]:', y[ indexlisttranspose ])
FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result. print ('y[indexlist.T]:', y[ indexlisttranspose ]) y[indexlist.T]: [ 1 2 24]
你知道多维数组是如何转换的吗?
它可以通过为每个索引提供一维数组来扩展为多维数组,因此对于二维数组
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
最快的方法是X[tuple(index.T)]
,其中X
包含元素index
的 ndarray 是希望检索的索引的 ndarray。