Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.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 将向量压缩成笛卡尔积_Python_Algorithm_Cartesian Product - Fatal编程技术网

Python 将向量压缩成笛卡尔积

Python 将向量压缩成笛卡尔积,python,algorithm,cartesian-product,Python,Algorithm,Cartesian Product,我有n10维向量,其中每个元素的值可以是0,1或2。 例如,向量v=(0,1,1,2,0,1,2,0,1,1)是其中一个向量。 是否有一种算法(最好是python)可以将这些向量压缩成最少数量的笛卡尔乘积。如果不是完美的解决方案,是否有一个算法,至少可以提供良好的压缩 示例:两个“笛卡尔向量” ([1,2],0,1,0,0,0,1,1[0,1],0])(给出4个向量)和(0,1,0,2,0,0,0,0,1)(给出2个向量)给出了N=6个向量的最优解: 1,0,1,0,0,0,1,1,0,0 2,

我有n10维向量,其中每个元素的值可以是0,1或2。 例如,
向量v=(0,1,1,2,0,1,2,0,1,1)
是其中一个向量。 是否有一种算法(最好是python)可以将这些向量压缩成最少数量的笛卡尔乘积。如果不是完美的解决方案,是否有一个算法,至少可以提供良好的压缩

示例:两个“笛卡尔向量”
([1,2],0,1,0,0,0,1,1[0,1],0])
(给出4个向量)和
(0,1,0,2,0,0,0,0,1)
(给出2个向量)给出了N=6个向量的最优解:

1,0,1,0,0,0,1,1,0,0
2,0,1,0,0,0,1,1,0,0
1,0,1,0,0,0,1,1,1,0
2,0,1,0,0,0,1,1,1,0
0,1,0,2,0,0,0,2,0,1
0,1,0,2,0,0,2,2,0,1

如果你的向量是(0,1)值的,你将面临最小DNF问题,(如果我错了请纠正我)NP难问题。拥有(0,1,2)值向量不会使问题变得更简单。

贪婪算法可能有用:

Let S = <V1, V2, ... Vn>

has_merge_ops = True

while has_merge_ops:
    has_merge_ops = False

    S' = []
    for v in S:
        if there exits v' which differs from v by just only ONE element:
            V = merge v and v' by merging the different values at index k
            S'.append(V)
            S.remove(v)
            S.remove(v')
            has_merge_ops = True

    S = S'

return S

你看过和库了吗?也许可以帮助你。itertools.product似乎从声明的笛卡尔积创建向量,我想反过来说。不过,在算法中使用可能会有所帮助。你们有多少个向量?有时会有所不同,但通常在3000个左右!我会试试看。不用担心,如果我从跨越([0,1]、[0,1]、0)和([0,2]、[0,2]、1)的行开始,我将以([0,0,[0,1]]、(0,1,0)、(0,2,1)、(1,[0,1]、[0,1]、[0,2]、1)作为解决方案。但在起跑阵容较大的情况下可能会很好地发挥作用。
after sorting, S = 
0,1,0,2,0,0,0,2,0,1
0,1,0,2,0,0,2,2,0,1
1,0,1,0,0,0,1,1,0,0
1,0,1,0,0,0,1,1,1,0
2,0,1,0,0,0,1,1,0,0
2,0,1,0,0,0,1,1,1,0

After first pass:
0,1,0,2,0,0,[0,2],2,0,1
1,0,1,0,0,0,1,1,[0,1],0
2,0,1,0,0,0,1,1,[0,1],0

After 2nd pass:
0,1,0,2,0,0,[0,2],2,0,1
[1,2],0,1,0,0,0,1,1,[0,1],0

Algorithm stops since no more merging is possible.