Один из подходов состоит в том, чтобы использовать маску для заполнения недопустимых записей массива значениями в 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]])]