Skip to main content
 首页 » 编程设计

python之如果其中的任何列表至少包含前一行的一个值,则过滤一个 numpy 数组

2025年05月04日15exmyth

我有一个 numpy 数组

b = np.array([[1,2], [3,4], [1,6], [7,2], [3,9], [7,10]]) 

现在,我想做以下事情:我想减少 b。我想减少它的方法是查看 b 的第一个元素,即 [1,2] 并基于此,我删除 b 中至少包含一个 1 或 2。在这种情况下,我将消除 [1,6] 和 [7,2]。然后我会查看 [3,4] 并消除那些至少包含 3 或 4 的元素。

在实践中,我从列表的开头开始,对于每个元素,我删除包含其中一个元素的其他元素。

我的尝试

for a in b: 
    np.insert(b[~np.array([np.any((a==b)[j]) for j in range(len(b))])], 0,a, axis = 0) 

遗憾的是,这不起作用!

这是我尝试过的方法,但它不起作用而且太长了。还有其他想法吗?

编辑 我认为主要问题是,当我执行 np.any((a==b)[j]) 时,它只对那些第一个元素等于 a 的第一个元素的元素说 True , 但当它们等于第二个元素时不说 True

编辑 2 你认为这行得通吗?

for index, a in enumerate(b): 
    np.insert(b[~np.array([np.any(np.logical_or(a[0]==b, a[1]==b)[j]) for j in range(len(b))])], index, a,  axis = 0) 

请您参考如下方法:

一个简单的解决方案是使用普通的 Python 循环:

b = np.array([[1,2], [3,4], [1,6], [7,2], [3,9], [7,10]]) 
 
final = [] 
seen = set() 
for row in b.tolist(): 
    if seen.intersection(row):  # check if one element of the row has already been seen. 
        continue 
    else: 
        # No item has been seen, so append this row and add the contents to the seen set. 
        seen.update(row) 
        final.append(row) 
 
print(final) 
# [[1, 2], [3, 4], [7, 10]] 

我不确定是否有一个很好的 NumPy 函数来解决这类问题,但使用纯 Python 应该已经非常快了。