Python:如何在大于 M 个公共(public)列中找到大于 N 行且单元格非零

标签 python algorithm numpy matrix scipy

我有 n x m 矩阵,我想以编程方式在超过 M 个公共(public)列中找到包含非零单元格的 N 行或更多行。

例如。这是矩阵:

matrix([[ 0.,  0.,  1.,  1.,  1.,  0.,  1.,  0.],
        [ 1.,  0.,  1.,  0.,  1.,  1.,  0.,  1.],
        [ 1.,  0.,  0.,  0.,  0.,  1.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  1.,  0.,  1.,  0.],
        [ 0.,  1.,  0.,  1.,  1.,  0.,  1.,  0.],
        [ 0.,  1.,  0.,  1.,  0.,  0.,  0.,  0.]])

我正在寻找 2 个或更多行,其中包含 2 个或更多公共(public)列中的非零单元格。有几种可能的结果,其中一种是:

row1: [ 1.,  0.,  1.,  0.,  1.,  1.,  0.,  1.],
row2: [ 1.,  0.,  0.,  0.,  0.,  1.,  0.,  0.],
      col1                     col5

是否可以找到解决此任务的所有行组合?

最佳答案

from pprint import pprint
from itertools import combinations

def solve(lst, m):

    col, n = {}, len(lst)
    for i, x in enumerate(lst):
        col[i] = [j for j, y in enumerate(x) if y]

    for s in xrange(n, m-1, -1):
        for c in combinations(xrange(n), s):
            values  = set(col[c[0]]).intersection(*(col[k] for k in c[1:]))
            if len(values) >= m:
                yield [lst[k] for k in c]

for x in solve(matrix, 2):
    pprint(x)

输出:

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

关于Python:如何在大于 M 个公共(public)列中找到大于 N 行且单元格非零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25582072/

相关文章:

ruby - 奇数顺序排列

c - 编写一个支持 '.' , '*' 和 '.*' 的正则字符串匹配函数

python - 给定原始和复杂的一维数据的核估计

python - 在 Windows 上使用 MKL 编译 NumPy - DLL 加载失败

python - 我们如何使用合并操作后找到的数据更新相似列的行中的列数据?

python - 如何在 Python 中执行二分法

c++ - 如何解决我们必须向前和向后迭代的 Broken Necklace Problem

python - 如何用 numpy 数组的列的平均值填充 nan 值?

python3 管理.py runserver

python - 压缩一堆(字符串对)的算法