首页 > 解决方案 > 查找数组中某些元素的所有组合

问题描述

我有一个多维 numpy 数组和一个对象列表,一些 numpy 数组的值是 None

找到所有可能的组合以用列表中的对象填充 None 值的最佳方法是什么?

例如,如果我的数组是

arr = [
    [1, None, 3],
    [9, 4, None],
]    

清单是

ls = [9, 8]

我想找到这些

arr = [
    [1, 9, 3],
    [9, 4, 8],
]  
arr = [
    [1, 8, 3],
    [9, 4, 9],
]

标签: pythonnumpy

解决方案


一种方法是使用掩码用 中的值填充数组的无效条目,ls次数与 中的排列一样多ls

但是,通过将这些排列的长度设置为arr. 这样我们也就占了案子len(ls) > (x == None).sum()

可以使用以下方法获得排列itertools.permutations

def fill_combs(x, fill, replace=None):
    from itertools import permutations
    m = x == replace
    for i in permutations(fill, int(m.sum())):
        x_ = x.copy()
        x_[m] = np.array(i)
        yield x_.astype(int)

样品运行:

arr = np.array([
    [1, None, 3],
    [9, 4, None],
])
ls = [9, 8]

list(fill_with_permut(arr, ls))

输出:

[array([[1, 9, 3],
        [9, 4, 8]]), 
 array([[1, 8, 3],
        [9, 4, 9]])]

或者更大的ls

ls = [3,5,2]
list(fill_with_permut(arr, ls))

[array([[1, 3, 3],
        [9, 4, 5]]), 
 array([[1, 3, 3],
        [9, 4, 2]]), 
 array([[1, 5, 3],
        [9, 4, 3]]), 
 array([[1, 5, 3],
        [9, 4, 2]]), 
 array([[1, 2, 3],
        [9, 4, 3]]),
 array([[1, 2, 3],
        [9, 4, 5]])]

推荐阅读