Python numpy 多维数组由另一个数组值过滤
Posted
技术标签:
【中文标题】Python numpy 多维数组由另一个数组值过滤【英文标题】:Python numpy multidimensional array filtering by another array values 【发布时间】:2022-01-21 01:22:59 【问题描述】:我有一个由 7 列和超过 43000 行组成的列表,表示来自 LIDAR 测量的点云的 x、y、z、R、G、B 强度。我想按颜色过滤云,手动隔离一部分。我想消除所有不具有 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]]
作为输出,我想获得一个新列表,其中仅包含满足先决条件的项目(在这种情况下,它们将是第一行和第三行)。 我想要一个这样的新列表:
newlist=[[4,8,12,179,118,74,I1], [7,14,21,185,193,112,I3]]
我没有使用 Python 的经验,所以我不知道从哪里开始。
【问题讨论】:
您能否在代码中显示您想要的输出以及您的尝试? 输入在整个过程中会保持不变吗?还是会在整个程序的运行时间内发生变化? (例如,列表将在某个时间点少 1 个元素或多一个元素) 什么是I1、I2 ...?字符串,变量?请包括minimal reproducible example 并说明您是否需要numpy
(如您的标题和标签建议)或list
解决方案。
输入是一个 txt 文件,有 7 列和 43000 行,在过滤器中是 3 列和 800 行。一旦初始化,它们直到过滤的那一刻才被使用,当我想消除颜色不在过滤器中的所有行时。就解决方案而言,我更喜欢使用 numpy 但带有列表的也可以。
如果 Data 是 np.array
,则使用 numpy
:Data[np.isin(Data[:,3:6], Filter).all(1)]
【参考方案1】:
在 cmets 中有一个解决方案:
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]])
【讨论】:
效果很好,非常感谢!以上是关于Python numpy 多维数组由另一个数组值过滤的主要内容,如果未能解决你的问题,请参考以下文章