找到最大1s列的最小行

时间:2017-11-07 05:55:34

标签: python arrays numpy

我有一个带有全零和1的numpy二维数组,我想要那些每列至少有一个1的行。例如:

问题陈述:查找在所有列中提供最多1秒的最小行。

INPUT1:

   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

这里有多个答案,如(t6,t1),(t6,t2),(t6,t3),(t6,t4),(t6,t5)。

INPUT2:

   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

我不想使用蛮力方法,因为我的原始矩阵非常大。有一种聪明的方法吗?

1 个答案:

答案 0 :(得分:1)

天真溶液,最坏情况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

我在没有经过太多测试的情况下完全在我的手机上写了这个,所以它可能也可能不起作用。它没有使用技巧,但相当快。请注意,当比率columns/rows较大或给定元素True的概率较小时,它会较慢,因为这样可以减少较少行满足所需条件的可能性,从而导致{ {1}}增加,这反过来会增加迭代组合的数量。