如何根据元组列表有效地 filter/create numpy.array 掩码
How to efficiently filter/create mask of numpy.array based on list of tuples
我尝试根据元组列表创建 numpy.array 的掩码。这是我产生预期结果的解决方案:
import numpy as np
filter_vals = [(1, 1, 0), (0, 0, 1), (0, 1, 0)]
data = np.array([
[[0, 0, 0], [1, 1, 0], [1, 1, 1]],
[[1, 0, 0], [0, 1, 0], [0, 0, 1]],
[[1, 1, 0], [0, 1, 1], [1, 0, 1]],
])
mask = np.array([], dtype=bool)
for f_val in filter_vals:
if mask.size == 0:
mask = (data == f_val).all(-1)
else:
mask = mask | (data == f_val).all(-1)
Output/mask:
array([[False, True, False],
[False, True, True],
[ True, False, False]]
问题是随着 data
数组的增大和 filter_vals
中元组数量的增加,它变得越来越慢。
它有什么更好的解决办法吗?我尝试使用 np.isin(data, filter_vals)
,但它没有提供我需要的结果。
使用广播的经典方法是:
*A, B = data.shape
(data.reshape((-1,B)) == np.array(filter_vals)[:,None]).all(-1).any(0).reshape(A)
然而,这会占用大量内存。所以适用性实际上取决于您的用例。
输出:
array([[False, True, False],
[False, True, True],
[ True, False, False]])
我尝试根据元组列表创建 numpy.array 的掩码。这是我产生预期结果的解决方案:
import numpy as np
filter_vals = [(1, 1, 0), (0, 0, 1), (0, 1, 0)]
data = np.array([
[[0, 0, 0], [1, 1, 0], [1, 1, 1]],
[[1, 0, 0], [0, 1, 0], [0, 0, 1]],
[[1, 1, 0], [0, 1, 1], [1, 0, 1]],
])
mask = np.array([], dtype=bool)
for f_val in filter_vals:
if mask.size == 0:
mask = (data == f_val).all(-1)
else:
mask = mask | (data == f_val).all(-1)
Output/mask:
array([[False, True, False],
[False, True, True],
[ True, False, False]]
问题是随着 data
数组的增大和 filter_vals
中元组数量的增加,它变得越来越慢。
它有什么更好的解决办法吗?我尝试使用 np.isin(data, filter_vals)
,但它没有提供我需要的结果。
使用广播的经典方法是:
*A, B = data.shape
(data.reshape((-1,B)) == np.array(filter_vals)[:,None]).all(-1).any(0).reshape(A)
然而,这会占用大量内存。所以适用性实际上取决于您的用例。
输出:
array([[False, True, False],
[False, True, True],
[ True, False, False]])