Рассмотрим двумерный массив numpy с 6 столбцами. Я добавил пробелы, чтобы подчеркнуть, что строки массива содержат 3 ПАРЫ элементов.
import numpy as np
a = np.array([[1,2, 3,4, 2,5],
[4,5, 6,7, 8,9],
[2,5, 1,3, 2,5],
[0,4, 0,4, 0,4],
[0,3, 1,7, 2,4]])
ПРОБЛЕМА: Я хочу создать 5 новых массивов b,c,d,e,f
, все из которых имеют то же количество строк, что и a
, которые показывают ПАРНЫЕ ПЕРЕСТАНОВКИ каждой строки массива a
. Порядок элементов каждой пары не меняется, но переставляются целые пары. Этот массив имеет 3 пары элементов, поэтому каждая первая строка из 6 массивов будет содержать разные парные перестановки [1,2, 3,4, 2,5]
.
Итак, 1-й ряд массивов a,b,c,d,e,f
в данном примере может быть:
[1,2, 3,4, 2,5], [1,2, 2,5, 3,4], [3,4, 1,2, 2,5], [3,4, 2,5, 1,2], [2,5, 1,2, 3,4], and [2,5, 3,4, 1,2]
Вторые строки массивов a to f
будут содержать шесть ПАРНЫХ ПЕРЕСТАНОВОК [4,5, 6,7, 8,9]
и т. д. Важно, чтобы каждый новый набор строк массива обрабатывал перестановки в одном и том же смысле (т.е. в порядке).
Все 4-е строки массивов a to f
будут содержать одни и те же элементы: [0,4, 0,4, 0,4]
Я экспериментировал с np.lexsort
, и я могу работать с перестановками отдельных элементов на основе sympy.utilities.iterables import multiset_permutations
, но я действительно в тупике, как настроить 6 массивов, используя переставленные пары элементов.:
Ну, это не элегантно, и я не горжусь этим, но это должно дать вам ожидаемый результат довольно эффективно, без необходимости зацикливания или перестановки.
import numpy as np
a = np.array([[1,2, 3,4, 2,5],
[4,5, 6,7, 8,9],
[2,5, 1,3, 2,5],
[0,4, 0,4, 0,4],
[0,3, 1,7, 2,4]])
b = np.flip(a.reshape(5,3,2), axis=1).reshape(5,-1) #swap last tuple for first and vice versa
np.hstack([a,
np.roll(b, 2, axis=1),
np.roll(b, 4, axis=1),
np.roll(a, 4, axis=1),
np.roll(a, 2, axis=1),
b]).reshape(5,-1,6)
array([[[1, 2, 3, 4, 2, 5], #Matches expected output
[1, 2, 2, 5, 3, 4],
[3, 4, 1, 2, 2, 5],
[3, 4, 2, 5, 1, 2],
[2, 5, 1, 2, 3, 4],
[2, 5, 3, 4, 1, 2]],
[[4, 5, 6, 7, 8, 9],
[4, 5, 8, 9, 6, 7],
[6, 7, 4, 5, 8, 9],
[6, 7, 8, 9, 4, 5],
[8, 9, 4, 5, 6, 7],
[8, 9, 6, 7, 4, 5]],
[[2, 5, 1, 3, 2, 5],
[2, 5, 2, 5, 1, 3],
[1, 3, 2, 5, 2, 5],
[1, 3, 2, 5, 2, 5],
[2, 5, 2, 5, 1, 3],
[2, 5, 1, 3, 2, 5]],
[[0, 4, 0, 4, 0, 4], #Matches expected output
[0, 4, 0, 4, 0, 4],
[0, 4, 0, 4, 0, 4],
[0, 4, 0, 4, 0, 4],
[0, 4, 0, 4, 0, 4],
[0, 4, 0, 4, 0, 4]],
[[0, 3, 1, 7, 2, 4],
[0, 3, 2, 4, 1, 7],
[1, 7, 0, 3, 2, 4],
[1, 7, 2, 4, 0, 3],
[2, 4, 0, 3, 1, 7],
[2, 4, 1, 7, 0, 3]]])
Делает свою работу с достаточно хорошей скоростью! Это был хороший способ использовать np.roll.