查找数组中某些元素的所有组合

2024-04-23 10:33:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个多维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],
]

Tags: 对象方法numpynone列表数组lsarr
2条回答
def update(arr, items):
    count = 0
    for i, x in enumerate(arr):
        if None in x:
            arr[i][x.index(None)] = items[count]
            count += 1
    return arr

import itertools
ls = [9, 8]
ls_ = list(itertools.permutations(ls))

for items in ls_:
    arr = [[1, None, 3],
           [9, 4, None]]
    print (update(arr,items))

输出:

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

例如:ls = [9, 8, 15]

输出:

[[1, 9, 3], [9, 4, 8]]
[[1, 9, 3], [9, 4, 15]]
[[1, 8, 3], [9, 4, 9]]
[[1, 8, 3], [9, 4, 15]]
[[1, 15, 3], [9, 4, 9]]
[[1, 15, 3], [9, 4, 8]]

一种方法是使用掩码用ls中的值填充数组的无效项,与ls中的^{置换的次数相同。你知道吗

但是,通过将这些排列的长度设置为arr中无效项的数量,可以使这种方法更加健壮。这样我们也可以解释这种情况。你知道吗

可使用^{}获得排列:

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]])]

相关问题 更多 >