На перестановках последовательных ПАРА элементов строки

Рассмотрим двумерный массив 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 массивов, используя переставленные пары элементов.:

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ну, это не элегантно, и я не горжусь этим, но это должно дать вам ожидаемый результат довольно эффективно, без необходимости зацикливания или перестановки.

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.

user109387 11.12.2020 03:12

Другие вопросы по теме