Python 查找最大为1s列的最小行

Python 查找最大为1s列的最小行,python,arrays,numpy,Python,Arrays,Numpy,我有一个包含所有0和1的numpy 2D数组,我希望这些行的每列至少有一个1。例如: 问题陈述:查找所有列中给出最大1的最小行 输入1: A B C D E t1 0 0 0 1 1 t2 0 1 1 0 1 t3 0 1 1 0 1 t4 1 0 1 0 1 t5 1 0 1 0 1 t6 1 1 1 1 0 A B C D E t1 0 0 0 1 1 t2 0 1 1 0 1 t3 0 1 1 0 1 t4 1 0 1 0 1 t5 1 0 1 0 1 t6 1 1 1 1

我有一个包含所有0和1的numpy 2D数组,我希望这些行的每列至少有一个1。例如:

问题陈述:查找所有列中给出最大1的最小行

输入1:

   A B C D E
t1 0 0 0 1 1
t2 0 1 1 0 1
t3 0 1 1 0 1
t4 1 0 1 0 1
t5 1 0 1 0 1
t6 1 1 1 1 0
   A B C D E
t1 0 0 0 1 1
t2 0 1 1 0 1
t3 0 1 1 0 1
t4 1 0 1 0 1
t5 1 0 1 0 1
t6 1 1 1 1 1
这里有多种答案,如(t6,t1),(t6,t2),(t6,t3),(t6,t4),(t6,t5)

输入2:

   A B C D E
t1 0 0 0 1 1
t2 0 1 1 0 1
t3 0 1 1 0 1
t4 1 0 1 0 1
t5 1 0 1 0 1
t6 1 1 1 1 0
   A B C D E
t1 0 0 0 1 1
t2 0 1 1 0 1
t3 0 1 1 0 1
t4 1 0 1 0 1
t5 1 0 1 0 1
t6 1 1 1 1 1
答:t6

我不想使用蛮力法,因为我的原始矩阵非常大。有没有一种聪明的方法可以做到这一点?

简单的解决方案,最坏的情况是O(2^n) 这将迭代所有可能的行选择,从尽可能少的行开始,使得平均情况通常是低多项式时间

from itertools import combinations
import numpy as np

def minimum_rows(arr):
    out_list = []
    rows = arr.shape[0]
    for x in range(1, rows):
        for combo in combinations(range(rows),x):
            if np.logical_or.reduce(arr[[combo]]).all():
                out_list.append(combo)
        if out_list:
            return out_list

我完全是在手机上写的,没有经过太多的测试,所以它可能有用,也可能无效。它不使用任何技巧,但速度相当快。请注意,当列/行比率
较大或给定元素为
True
的概率较小时,其速度会较慢,因为这使得满足所需条件的行较少,从而导致
x
增加,这反过来会增加迭代的组合数。

您能澄清一下吗?如果一行中的每一列都有一个“1”,那么这不是一行充满了“1”的吗?塞巴斯蒂安:如果一行都有1,那么只有那一行才是答案。为什么(t4,t3,t1)不是一个有效的答案?你的标题完全错了,它根本无法描述你的问题……这就是答案。