Я изучил этот вопрос, и люди продолжают советовать использовать np.meshgrid()
, чтобы найти все возможные комбинации массива. но проблема в том, что np.meshgrid()
не создает комбинаций, он производит продукты (аналогично itertools.product ())
в комбинации, элементы не повторяются и неупорядочены
arr = np.arange(5)
r = 3
Эти как выглядят комбинации
np.array(
list(itertools.combinations(arr, r))
)
>>> [[0, 1, 2],
[0, 1, 3],
[0, 1, 4],
[0, 2, 3],
[0, 2, 4],
[0, 3, 4],
[1, 2, 3],
[1, 2, 4],
[1, 3, 4],
[2, 3, 4]]
следующие не являются комбинациями
np.array(
list(itertools.product(arr, arr, arr))
)
>>> [[0, 0, 0],
[0, 0, 1],
[0, 0, 2],
[0, 0, 3],
[0, 0, 4],
[0, 1, 0],
[0, 1, 1],
[0, 1, 2],
....,
[4, 3, 2],
[4, 3, 3],
[4, 3, 4],
[4, 4, 0],
[4, 4, 1],
[4, 4, 2],
[4, 4, 3],
[4, 4, 4]])
np.array(
np.meshgrid(arr, arr, arr)
).transpose([2, 1, 3, 0]).reshape(-1, r)
>>> [[0, 0, 0],
[0, 0, 1],
[0, 0, 2],
[0, 0, 3],
[0, 0, 4],
[0, 1, 0],
[0, 1, 1],
[0, 1, 2],
....,
[4, 3, 2],
[4, 3, 3],
[4, 3, 4],
[4, 4, 0],
[4, 4, 1],
[4, 4, 2],
[4, 4, 3],
[4, 4, 4]])
для r = 2
Я нашел удобный способ находить комбинации
np.array(
np.triu_indices(len(arr), 1)
).T
>>> [[0, 1],
[0, 2],
[0, 3],
[0, 4],
[1, 2],
[1, 3],
[1, 4],
[2, 3],
[2, 4],
[3, 4]]
, но мне трудно найти какие-либо векторизованные методы для r > 2
ПРИМЕЧАНИЕ: даже если мой массив не [0, 1, 2, 3, 4]
, я мог бы использовать приведенные выше ответы в качестве индексов.
если это помогает представить,
для r = 2
требуемый ответ - это индексы верхнего правого треугольника квадратной матрицы размером len(arr)
без учета диагонали.
для r = 3
требуемый ответ - это индексы верхнего правого-верхнего тетраэдра (средний на изображении) трехмерного массива размером (как вы уже догадались) len(arr)
, игнорируя трехмерный эквивалент диагонали.
введите описание изображения здесь