Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:在2D数组中查找所有可能唯一的两个索引组合_Python_Arrays_Python 3.x_Numpy_Itertools - Fatal编程技术网

Python:在2D数组中查找所有可能唯一的两个索引组合

Python:在2D数组中查找所有可能唯一的两个索引组合,python,arrays,python-3.x,numpy,itertools,Python,Arrays,Python 3.x,Numpy,Itertools,我有一个numpy数组,大致相当于: data = ([1, 2, 3], [4, 5, 6], [7, 8, 9]) 我想找到这些值的所有唯一的两个索引组合。换句话说,我希望所有可能的组合都不重复行或列索引(类似于正确解决数独难题)。例如,所需的输出为: output >> ([1, 5, 9], [1, 6, 8], [2, 4, 9], [2, 6, 7], [3, 4, 8], [3, 5, 7]) 这个输出可以用它们相应的指数来表示: ([0][0]、[1][1]、[2

我有一个numpy数组,大致相当于:

data = ([1, 2, 3], [4, 5, 6], [7, 8, 9])
我想找到这些值的所有唯一的两个索引组合。换句话说,我希望所有可能的组合都不重复行或列索引(类似于正确解决数独难题)。例如,所需的输出为:

output >> ([1, 5, 9], [1, 6, 8], [2, 4, 9], [2, 6, 7], [3, 4, 8], [3, 5, 7])
这个输出可以用它们相应的指数来表示: ([0][0]、[1][1]、[2][2]、([0][0]、[1][2]、([0][1]、[1][0]、[2][2]、([0][1]、[1][2]、[2][0]、([0][2]、[1][1]、[2][0])

我尝试过使用itertools.permutations,虽然它确实为每个唯一的行找到了我的数据的所有可能排列,但它并不将每个列视为唯一的)

我只希望每行和每列中有一个值

我对python还比较陌生,有人对我该如何做有什么建议吗

from itertools import permutations

data = ([1, 2, 3], [4, 5, 6], [7, 8, 9])

output = [[row[y] for row, y in zip(data, permutation)]
          for permutation in permutations(range(len(data)))]
编辑:注释中的问题已更改为仅生成不包含0的结果。另外,由于
len(data)
为100,我们无法使用上面的
置换生成所有结果,然后对其进行过滤;那要花很长时间。我们在进行时必须正确选择它们,如下所示:

def get_nonzero_perms(data, remaining_indices=None):
    if not data:
        yield []
        return
    if remaining_indices is None:
        remaining_indices = list(range(len(data)))
    row = data[0]
    for i in remaining_indices:
        value = row[i]
        if value == 0:
            continue
        for perm in get_nonzero_perms(data[1:], [j for j in remaining_indices if j != i]):
            yield [value] + perm


for p in get_nonzero_perms(([2, 8, 0, 0], [0, 3, 9, 4], [0, 0, 5, 1], [4, 6, 0, 7])):
    print(p)
输出:

[2, 3, 5, 7]
[2, 9, 1, 6]
[2, 4, 5, 6]
[8, 9, 1, 4]
[8, 4, 5, 4]

你尝试了什么?欢迎来到。我们不是代码编写服务,因此请查看并向我们展示您所做的尝试。从itertools.permutations获取您的输出,并将其传递给内置的
set()
函数,该函数将消除重复项。感谢您的评论。我尝试在数组中调用itertools置换,但这会返回所有可能的组合,其中只有行是唯一的。我也开始编写递归循环,但很早就放弃了:我的真实数据集非常大,我需要一些更高效的内存。如果你的真实数据集非常大,那么整个过程肯定会失败。排列的数量增长得非常快。我没有想到要将zip()与我的排列列表结合使用,非常感谢!