Найти все комбинации только некоторых элементов массива - PullRequest
3 голосов
/ 27 марта 2019

У меня есть многомерный массив 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],
]

Ответы [ 2 ]

3 голосов
/ 27 марта 2019

Один из подходов состоит в том, чтобы использовать маску для заполнения недопустимых записей массива значениями в ls столько раз, сколько перестановок из ls.

* 1006.* Тем не менее, это можно сделать более надежным, установив длину этих перестановок равной количеству недействительных записей в 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]])]
1 голос
/ 27 марта 2019
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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...