Как объединить матрицы, такие как кусочки головоломки, в python

#python #pandas #matrix #concatenation #puzzle

Вопрос:

У меня есть три части головоломки, определенные как несколько массивов, 7×7, следующим образом:

 R3LRU = pd.DataFrame([
    [1, 1, 1, 1, 1, 1, 1],
    [1, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 1]
])
 

Я пытаюсь присоединиться к ним по следующим правилам: 1111111 может быть присоединен к 1000001, 1000001 может быть присоединен к 1000001, но 1111111 не может быть присоединен к 1111111. Лучшей иллюстрацией будет следующее:

введите описание изображения здесь

Я пробовал использовать pd.concat функцию, но она просто склеивает их вместе, а не соединяет по бокам, как это:

введите описание изображения здесь

Или, с точки зрения вывода кода, как это:

    0  1  2  3  4  5  6  0  1  2  3  4  5  6  0  1  2  3  4  5  6
0  1  1  1  1  1  1  1  1  0  0  0  0  0  1  1  1  1  1  1  1  1
1  1  0  0  0  0  0  1  1  0  0  0  0  0  1  1  0  0  0  0  0  0
2  1  0  0  0  0  0  1  1  0  0  0  0  0  1  1  0  0  0  0  0  0
3  1  0  0  0  0  0  1  1  0  0  0  0  0  1  1  0  0  0  0  0  0
4  1  0  0  0  0  0  1  1  0  0  0  0  0  1  1  0  0  0  0  0  0
5  1  0  0  0  0  0  1  1  0  0  0  0  0  1  1  0  0  0  0  0  0
6  1  0  0  0  0  0  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 

Я полагаю, что хотел бы присоединиться к столбцам 6 и 0 или строкам 6 и 0

Как я могу определить стороны «соединения», чтобы части соединялись в соответствии с предлагаемыми правилами?

Комментарии:

1. Непонятно, что вы имеете в виду. Как выглядит запрет на вступление? Как выглядит полученный результат? Как принимаются фрагменты (все ли они известны при запуске или каким-то образом сгенерированы)? Вы хотите сгенерировать все допустимые соединения? и т. Д. и т. Д.

2. Я думаю, что проблема с людьми, которые приходят с ответом, заключается в том, что вы четко не определили, что вы имели в виду под «присоединением». Возможно, вам захочется объяснить природу объединения (что объединение двух массивов 7×7 приводит к массиву 13×7, объясняя, что один столбец удаляется при соединении и т. Д., И объяснить ожидаемый результат, когда 3 соединяются горизонтально)

Ответ №1:

Я так понимаю, вы хотите объединить, если последний столбец и первый столбцы совпадают, а затем «перекрывают» обе части. Я не думаю, что панды хорошо подходят для этой проблемы, так как вам нужны только значения, никаких столбцов или в основном каких-либо функций, для которых вы использовали бы панд.

Я бы рекомендовал простые массивы numpy. Тогда вы могли бы сделать что-то вроде

 In [1]: import numpy as np

In [2]: R3LRU = np.array([
   ...:     [1, 1, 1, 1, 1, 1, 1],
   ...:     [1, 0, 0, 0, 0, 0, 1],
   ...:     [1, 0, 0, 0, 0, 0, 1],
   ...:     [1, 0, 0, 0, 0, 0, 1],
   ...:     [1, 0, 0, 0, 0, 0, 1],
   ...:     [1, 0, 0, 0, 0, 0, 1],
   ...:     [1, 0, 0, 0, 0, 0, 1]
   ...: ])

In [3]: R3LRU
Out[3]: 
array([[1, 1, 1, 1, 1, 1, 1],
       [1, 0, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 1]])
 

Получите последний столбец первой части и первый столбец второй части

 In [4]: R3LRU[:,0]
Out[4]: array([1, 1, 1, 1, 1, 1, 1])

In [5]: R3LRU[:,-1]
Out[5]: array([1, 1, 1, 1, 1, 1, 1])
 

Сравните их

 In [6]: R3LRU[:,0] == R3LRU[:,-1]
Out[6]: array([ True,  True,  True,  True,  True,  True,  True])

In [7]: np.all(R3LRU[:,0] == R3LRU[:,-1])
Out[7]: True
 

Если они равны, объедините их

 In [8]: if np.all(R3LRU[:,0] == R3LRU[:,-1]):
   ...:     combined = np.hstack([R3LRU[:,:-1], R3LRU])

In [9]: combined
Out[9]: 
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1]])
 

Возможно, ваши правила немного сложнее, чем простое == сравнение, но вы можете просто усложнить это if утверждение, чтобы отразить все правила, которые у вас есть 😉