使用Numpy查找数组中行的组合,以使每一列的总和为相同的值

塞德斯

我试图用来numpy查找矩阵中行的配置,以便对行的列求和将得到相同的值。例如,对于矩阵/数组

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

我想将第一行,第二行和最后一行作为输出,因为

  0,0,0,1
  1,0,1,0
  0,1,0,0 +
  -------
= 1,1,1,1

有内置的工具numpy可以帮助我实现这一目标吗?

伊利

一种解决方案是枚举行的幂集,然后检查每个可能的行子集的求和条件。对于具有大量行的矩阵,这可能会非常慢。

使用标准itertools配方进行功率设置:

from itertools import chain, combinations

def powerset(iterable):
    xs = list(iterable)
    return chain.from_iterable(combinations(xs, n) for n in range(len(xs) + 1))

然后我展示了一个包含一些综合数据的工作示例:

In [79]: data
Out[79]: 
array([[0, 1, 1],
       [0, 0, 1],
       [1, 0, 1],
       [0, 1, 1],
       [0, 0, 0],
       [0, 1, 0],
       [1, 1, 1],
       [1, 1, 0],
       [1, 1, 1],
       [0, 1, 0]], dtype=int32)

In [80]: def is_constant(array):
    ...:     return (array == array[0]).all()
    ...: 

In [81]: solution = []

In [82]: for candidate in powerset(range(len(data))):
    ...:     if candidate and is_constant(data[candidate, :].sum(axis=0)):
    ...:         solution.append(candidate)
    ...: 

例如,其中显示:

In [83]: solution
Out[83]: 
[(4,),
 (6,),
 (8,),
 (1, 7),
 (2, 5),
 (2, 9),
 (4, 6),
 (4, 8),
 (6, 8),
 (0, 2, 7),
 (1, 4, 7),
 (1, 6, 7),
 (1, 7, 8),
 (2, 3, 7),
 (2, 4, 5),
 (2, 4, 9),
 (2, 5, 6),
 (2, 5, 8),
 (2, 6, 9),
 (2, 8, 9),
 (4, 6, 8),
 (0, 2, 4, 7),
 (0, 2, 6, 7),
 (0, 2, 7, 8),
 (1, 2, 5, 7),
 (1, 2, 7, 9),
 (1, 4, 6, 7),
 (1, 4, 7, 8),
 (1, 6, 7, 8),
 (2, 3, 4, 7),
 (2, 3, 6, 7),
 (2, 3, 7, 8),
 (2, 4, 5, 6),
 (2, 4, 5, 8),
 (2, 4, 6, 9),
 (2, 4, 8, 9),
 (2, 5, 6, 8),
 (2, 6, 8, 9),
 (0, 2, 4, 6, 7),
 (0, 2, 4, 7, 8),
 (0, 2, 6, 7, 8),
 (1, 2, 4, 5, 7),
 (1, 2, 4, 7, 9),
 (1, 2, 5, 6, 7),
 (1, 2, 5, 7, 8),
 (1, 2, 6, 7, 9),
 (1, 2, 7, 8, 9),
 (1, 4, 6, 7, 8),
 (2, 3, 4, 6, 7),
 (2, 3, 4, 7, 8),
 (2, 3, 6, 7, 8),
 (2, 4, 5, 6, 8),
 (2, 4, 6, 8, 9),
 (0, 2, 4, 6, 7, 8),
 (1, 2, 4, 5, 6, 7),
 (1, 2, 4, 5, 7, 8),
 (1, 2, 4, 6, 7, 9),
 (1, 2, 4, 7, 8, 9),
 (1, 2, 5, 6, 7, 8),
 (1, 2, 6, 7, 8, 9),
 (2, 3, 4, 6, 7, 8),
 (1, 2, 4, 5, 6, 7, 8),
 (1, 2, 4, 6, 7, 8, 9)]

我们可以针对以下几种情况验证解决方案:

In [84]: data[(1, 2, 4, 6, 7, 8, 9), :].sum(axis=0)
Out[84]: array([4, 4, 4])

In [85]: data[(0, 2, 4, 6, 7), :].sum(axis=0)
Out[85]: array([3, 3, 3])

为了将其扩展到更特定的用例,您可以itertools.combinations用来生成仅具有特定大小的子集,例如恰好2行或恰好3行等。

或者,您可以从示例中给出的结果集中过滤掉不需要的结果(例如一次由一行组成的琐碎解决方案)。

请注意,您可以简化函数的定义powerset(我使用的实际上是取自有关itertools配方的Python文档)。您可以传递整数并直接跳过以返回最终chain.from_iterable结果,而不是传递可转换为列表的可迭代对象,然后将其修改为仅len(data)作为powerset我示例中的参数传递,如下所示:

from itertools import chain, combinations

def powerset(N):
    """Power set of integers {0, ..., N-1}."""
    xs = list(range(N))
    return chain.from_iterable(combinations(xs, n) for n in range(N + 1))

...
for candidate in powerset(len(data)):
    ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Matplotlib:为numpy数组的每一列添加图例

numpy:如何在numpy数组的每一列中查找第一个非零值?

查找每列行值的组合,以使列具有唯一的行

Python 查找最小值。二维数组中每一列的值

查找具有唯一列的数组中每一行的最小值

如何沿轴使用 argmax 来获取 numpy 二维数组的每一列中的最大值?

查找二维数组中每一列的最大值

如何使用Python获取另一列中具有相同值的值的总和?

在2D NumPy数组中将孤岛的每一列缩放为其长度

在非单元格引用的 Excel 数组的每一行或每一列中查找最大值

在非单元格引用的 Excel 数组的每一行或每一列中查找最大值

查找每一列的唯一值

numpy:为矩阵的每一列选择特定行的值

在NumPy数组的每一列中找到两个最小值的最快方法

numpy数组的每一行的特定列组的总和

SQL查询在每一列中返回相同的值

使用python查找CSV文件的每一列的最小值

使用奇特索引从numpy矩阵的每一列获取一个值

如何获得每一列的总和?

将numpy数组的每一列与另一个数组的每个值相乘

使用numpy将数组元素添加到矩阵的每一列

如何在3D Numpy数组的每一列中查找连续1的组数

NumPy - 在 nd 数组的每一列中查找和打印非零元素

计算numpy数组中一列中相同值的数量

为数据框的每一列替换特殊值

为具有指定列的每一行分配值到numpy数组

在python中使用numpy在一列中标识具有相同值的向量

如何计算1列中的值与另一列的相同值的总和?

使用numpy在第一矩阵列中搜索数组,并获取下一列的值