簡體   English   中英

Python numpy 多維數組過濾另一個數組值

[英]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之前減少DataFilter的維度,它會更快地工作:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM