Python 如何对关系中的矩阵进行分组
我喜欢有几个矩阵。我首先检查他们是否处于转换关系中。如果是,我想将它们分组。如果不是,我喜欢把它们分开。例如,d)和g)是a)的移位产物;e) 和h)是b)的移动产品;f) 是c)的移位积。然后我喜欢分组(a,d,g);(b、e、h);(c,f) 编辑:Python 如何对关系中的矩阵进行分组,python,numpy,Python,Numpy,我喜欢有几个矩阵。我首先检查他们是否处于转换关系中。如果是,我想将它们分组。如果不是,我喜欢把它们分开。例如,d)和g)是a)的移位产物;e) 和h)是b)的移动产品;f) 是c)的移位积。然后我喜欢分组(a,d,g);(b、e、h);(c,f) 编辑: 我已更正最后2D矩阵中的数字,以匹配OP原始图形中矩阵h中两点的位置 我简化了for循环 我增强了结果组的打印输出(如OP所述,这些组是a、d、h、b、e、g和c、f) 面对问题的模糊描述,一个可能的解决方案是在字典中对矩阵进行分组,该字典
h
中两点的位置for
循环a、d、h
、b、e、g
和c、f
)面对问题的模糊描述,一个可能的解决方案是在字典中对矩阵进行分组,该字典根据矩阵中两点之间的坐标增量编制索引
什么是起始索引?(0,0)或(1,1)它们是矩阵图中的指数和点如何关联@平天
(1,1)、(2,1)
可以切换到(2,3)、(3,3)
,目前为止还不错,但是。。。(3,3)、(2,3)
也是(1,1)、(2,1)
的移位吗?是@gboffi,通过向量(1,2)。很抱歉,我的问题不清楚。这里的变化可以理解如下。向量(0,1)移动坐标(1,1)和(2,1)分别为(1,2)和(2,2)的两个点的集合(a)->集合(d)。类似地,通过向量(1,2),两点(1,1)和(2,1)的集合(a)成为(2,3)和(3,3)的集合(g)。类似地,通过向量(1,1),两点(1,2)和(2,2)的集合(d)变换为两点(2,3)和(3,3)的集合(g)。这就是为什么集合(a)、(d)和(g)是相同的。这不是因为每个集合中两个点之间的距离。啊,如果你将相同的向量添加到两个点上① 点之间的2D距离保持不变(这是我的dx,dy
计算),并且② 点的顺序很重要。请不要仅仅从一个原始的公式来思考,如果你从不同的角度来看问题,有时问题会变得更容易。我恐怕不是这样。如果每场比赛都有3分或3分以上,那怎么办?请帮助我考虑编辑问题中的一个例子。
def is_shift(set1, set2):
shift = None # will store a tuple of delta_x, delta_y
for (x1, y1), (x2, y2) in zip(set1, set2):
cur_shift = x1 - x1, y1 - y2
if not shift: # the first pair of points
shift = cur_shift
elif shift != cur_shift: # shifted the same way as the first one?
return False
return True
matrices1 = np.array([
[(1, 1), (2, 1)],
[(1, 2), (2, 1)],
[(1, 3), (2, 1)],
[(1, 2), (2, 2)],
[(1, 3), (2, 2)],
[(2, 3), (3, 1)],
[(2, 3), (3, 3)],
[(2, 2), (3, 2)]
])
matrices2 = array([
[(1, 1), (2, 1), (3, 1)],
[(1, 2), (2, 1), (3, 1)],
[(1, 3), (2, 1), (2, 2)],
[(1, 2), (2, 2), (3, 2)],
[(1, 3), (2, 2), (3, 2)],
[(2, 3), (3, 1), (3, 2)],
[(1, 3), (2, 3), (3, 3)],
[(2, 2), (3, 1), (4, 4)],
[(1, 1), (3, 3), (4, 1)]
])
In [20]: from numpy import array
...:
...: matrices = array([
...: [(1, 2), (2, 1)],
...: [(1, 3), (2, 1)],
...: [(1, 2), (2, 2)],
...: [(1, 3), (2, 2)],
...: [(2, 3), (3, 1)],
...: [(2, 3), (3, 3)],
...: [(2, 2), (3, 1)]
...: ])
...:
...: shifted_groups = {}
...:
...: for m in matrices:
...: dx, dy = m[1]-m[0]
...: shifted_groups.setdefault((dx, dy), []).append(m)
...:
...: for k, v in shifted_groups.items():
...: print("%10r: "%(k,), ''.join("%r"%[list(list(r) for r in m) for m in v]))
(1, 0): [[[1, 1], [2, 1]], [[1, 2], [2, 2]], [[2, 3], [3, 3]]]
(1, -1): [[[1, 2], [2, 1]], [[1, 3], [2, 2]], [[2, 2], [3, 1]]]
(1, -2): [[[1, 3], [2, 1]], [[2, 3], [3, 1]]]
In [21]: