Python 查找最大为1s列的最小行
我有一个包含所有0和1的numpy 2D数组,我希望这些行的每列至少有一个1。例如: 问题陈述:查找所有列中给出最大1的最小行 输入1: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
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)不是一个有效的答案?你的标题完全错了,它根本无法描述你的问题……这就是答案。