我有一个带有全零和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
我不想使用蛮力方法,因为我的原始矩阵非常大。有一种聪明的方法吗?
答案 0 :(得分:1)
这会迭代所有可能的行选择,从尽可能少的行开始,使平均情况通常为低多项式时间。
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}}增加,这反过来会增加迭代组合的数量。