如何在python中加入像拼图这样的矩阵

Posted

技术标签:

【中文标题】如何在python中加入像拼图这样的矩阵【英文标题】:How to join matrices like puzzle pieces in python 【发布时间】:2021-09-08 20:51:07 【问题描述】:

我将三个拼图块定义为多个 7x7 数组,方式如下:

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 行加入

我如何定义“连接”边,以便片段通过建议的规则连接?

【问题讨论】:

不清楚你的意思。阻止加入是什么样的?结果输出是什么样的?作品是如何收到的(它们在开始时都是已知的还是以某种方式生成的)?您是否希望生成所有有效的联接?等等等等。 我认为人们想出答案的问题在于您没有明确定义“加入”的含义。您可能想解释连接的性质(两个 7x7 数组的连接产生一个 13x7 数组,解释连接时消除一列等,并解释水平连接 3 时的预期结果) 【参考方案1】:

如果最后一列和第一列匹配然后“重叠”这两个部分,我认为您想要连接。我不认为,pandas 非常适合这个问题,因为你只需要值,没有列或基本上任何你会使用 pandas 的功能。

我会推荐简单的 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 语句更复杂以反映您拥有的所有规则;)

【讨论】:

以上是关于如何在python中加入像拼图这样的矩阵的主要内容,如果未能解决你的问题,请参考以下文章

逆序数-拼图游戏必备知识

python pillow 把图片切成拼图块

Python:如何在不扩展矩阵的情况下增加矩阵的维度?

如何在 Python 中从 Numpy 矩阵创建列表

如何使用 PANDAS / Python 将矩阵转换为列数组

如何设计一种算法来计算倒计时式数学数字拼图