#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
утверждение, чтобы отразить все правила, которые у вас есть 😉