[英]Python numpy multidimensional array filtering by another array values
我有一個由 7 列和超過 43000 行組成的列表,代表 x、y、z、R、G、B、來自 LIDAR 測量的點雲的強度。 我想按顏色過濾雲,手動隔離一部分。 我想消除所有不具有 RGB 組合等於過濾器中存在的那些之一的行。 例如:
Data=[[4,8,12,179,118,74,I1], [5,10,45,142,186,98,I2], [7,14,21,185,193,112,I3], [8,16,24,115,140,43,I3]]
我在第 4、5 和 6 列(RGB)上有一個過濾器,如下所示:
Filter=[[179,118,74],[185,193,112]]
作為 output,我想獲得一個新列表,其中僅包含滿足先決條件的項目(在這種情況下,它們將是第一行和第三行)。 我想要一個這樣的新列表:
newlist=[[4,8,12,179,118,74,I1], [7,14,21,185,193,112,I3]]
我沒有 Python 的經驗,所以我不知道從哪里開始。
評論中有一個解決方案:
Data[np.isin(Data[:, 3:6], Filter).all(axis=1)]
事實上, np.isin
是解決此類問題的最佳選擇。
我很確定如果您在以下列方式之一使用np.isin
之前減少Data
和Filter
的維度,它會更快地工作:
def numpy_dimreduce_ravel(arr, shape):
return np.ravel_multi_index(arr.T, shape, order='F')
def numpy_dimreduce_dot(arr, shape):
dim_shape = np.cumprod(np.insert(shape[:-1], 0, 1))
return np.dot(arr, dim_shape)
Data = np.array([[4,8,12,179,118,74], [5,10,45,142,186,98], [7,14,21,185,193,112], [8,16,24,115,140,43]])
shape = (256, 256, 256)
new_Data = numpy_dimreduce_ravel(data[:,3:6], shape) #[4880051, 6470286, 7389625, 2854003]
# or:
new_Data = numpy_dimreduce_dot(data[:,3:6], shape) #[4880051, 6470286, 7389625, 2854003]
# and:
new_Filter = numpy_dimreduce_ravel(Filter, shape) #[4880051, 7389625]
因此,您現在可以以更靈活的方式進行操作:
>>> Data[np.isin(new_data, new_Filter)]
array([[ 4, 8, 12, 179, 118, 74],
[ 7, 14, 21, 185, 193, 112]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.