【问题标题】:Counting crosses in a given matrix计算给定矩阵中的交叉数
【发布时间】:2022-12-14 21:36:41
【问题描述】:

想象一下,我有一个矩阵,我需要计算有多少个交叉点。近十字是普通十字的延伸,这意味着矩阵的整行和整列的数字相同,但交点处的数字可能不同。我应该如何寻找交叉点然后测试附近的交叉点?

测试用例:

[[1, 1, 1, 1, 1],
 [2, 2, 1, 3, 3],
 [1, 2, 1, 2, 2],
 [5, 5, 1, 6, 6],
 [2, 2, 1, 1, 1]]

[[1, 1, 0, 1, 1],
 [0, 0, 1, 0, 0],
 [0, 0, 1, 0, 0],
 [0, 0, 1, 0, 0],
 [0, 0, 1, 0, 0]]

两者都有 1 个近交叉。

[[1, 1, 0, 1, 1],
 [0, 0, 1, 1, 0],
 [1, 1, 1, 0, 1], 
 [0, 0, 1, 1, 0],
 [0, 0, 1, 1, 0]]

有 2 个近十字架。

【问题讨论】:

  • 请提供您为解决此问题而尝试过的尝试代码。
  • 你的矩阵总是 5x5 吗?
  • 我不禁认为您只需要检查 np.unique(matrix, axis=0)np.unique(matrix, axis=1) <= 2 的位置。

标签: python algorithm matrix


【解决方案1】:

您可以使用 Counter 来标识哪些行最多有一个偏差值。当一个频率至少为 n-1 时,这是正确的,其中 n 是列数。

然后你可以列出偏差点(坐标),或者列上的所有点(当没有偏差值时)。这给出了一组坐标,每个坐标可以是近交叉的交叉点。

转置矩阵并重复上述过滤,然后镜像每个结果点(x vs. y)

因此,您将有两组潜在的交叉点。这两组的交集将给出近交叉点的实际交叉点。

下面是该算法的一个实现:

from collections import Counter

def transpose(matrix):
    return [list(row) for row in zip(*matrix)]

def potentialcrosspoints(matrix):
    n = len(matrix[0])
    for i, row in enumerate(matrix):
        entries = list(Counter(row).items())
        if len(entries) == 1:
            for j in range(n):
                yield i, j, row[0]
        elif n - 1 in (entries[0][1], entries[1][1]):
            for j, entry in enumerate(entries):
                if entry[1] == 1:
                    yield i, row.index(entry[0]), entries[1 - j][0]

def mirrorpoints(points):
    return [(j, i, val) for i, j, val in points]

def countnearcrosses(matrix):
    return len(set(potentialcrosspoints(matrix)).intersection(
               mirrorpoints(potentialcrosspoints(transpose(matrix)))))

# Run of the last example in the question
matrix = [[1, 1, 0, 1, 1],
          [0, 0, 1, 1, 0],
          [1, 1, 1, 0, 1], 
          [0, 0, 1, 1, 0],
          [0, 0, 1, 1, 0]]
total = countnearcrosses(matrix)    
print(total)  # 2

# Example mentioned in comments
matrix = [[1, 0],
          [0, 1]]
total = countnearcrosses(matrix)    
print(total)  # 4

【讨论】:

  • 哇,你有一个非常聪明的方法。我可以澄清一下“.difference”是否意味着“.intersect”符合您的描述吗?同时,我们需要转置 transpose(matrix) 返回的每个坐标才能使相交起作用?因为现在在 [[1, 1, 0, 1, 1], [1, 1, 1, 1, 0], [1, 1, 1, 0, 1], [0, 0, 1, 1, 0], [0, 0, 1, 1, 0]] 将给出 3 而不是 2
  • 你在这两点上都完全正确。应该是intersection而不是difference,而且点数应该调换回来。我已经在发布的代码中更新了它。
  • 该算法失败并为 [[0, 1], [1, 0]] 返回 1 而不是 4。
  • 谢谢@johan,我现在在更新中解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2011-02-22
  • 2020-07-09
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多