Python 偏序极大元

Python 偏序极大元,python,Python,我正在寻找Python代码,以找到偏序中的最大元素 还有另外两个帖子解决了这个问题 但它们只有模糊的描述,没有代码。自从有人提出这些问题以来,也有几年过去了 编辑:更具体地说,他们都建议构建DAG。我自己的想法是使用一些循环,并在列表中添加和删除。然而,我想知道是否有一些简短的“pythonic”方式来编码这个 更准确地说,我有一个数组列表,其中的条目为0,1;都一样长。这些数组是GF(2)上某个矩阵的图像空间,该域只有0和1 设x和y为两个数组。 我说x经过更多的测试,我最终得到了以下

我正在寻找Python代码,以找到偏序中的最大元素

还有另外两个帖子解决了这个问题

但它们只有模糊的描述,没有代码。自从有人提出这些问题以来,也有几年过去了

编辑:更具体地说,他们都建议构建DAG。我自己的想法是使用一些循环,并在列表中添加和删除。然而,我想知道是否有一些简短的“pythonic”方式来编码这个

更准确地说,我有一个数组列表,其中的条目为0,1;都一样长。这些数组是GF(2)上某个矩阵的图像空间,该域只有0和1

x
y
为两个数组。
我说
x经过更多的测试,我最终得到了以下代码。上面的问题代码仍然有一些bug

import numpy as np

def maximal_elements(input_list):
  """Given a list of np.array, compute the maximal elements.

  Call:
    maximal = maximal_elements(input_list)
  Input:
    input_list: list of np.array, all need to have the same length.
  Output:
    maximal: list of np.array, which contains the maximal elements of input_list,
      the order used is elementwise "<="      
  """
  l = input_list.copy()
  l.sort(reverse=True, key=np.sum)
  maximal = [l[0]]
  for e in l[1:]:
    i = 0
    replaced = False
    while i < len(maximal):
      if (maximal[i] <= e).all():
        if replaced:
          maximal.pop(i)
          i -= 1
        else:
          maximal[i] = e.copy()
          replaced = True
      if (e <= maximal[i]).all():
        if not (e == maximal[i]).all():
          break
      i += 1
    if i == len(maximal) and not replaced:
      maximal.append(e.copy())
  return maximal

import itertools
import random
random.seed(2)
l = [np.array(e) for e in random.sample(list(itertools.product([0,1], repeat=5)), 9)]
maximal_elements(l)
将numpy导入为np
定义最大元素(输入列表):
“”“给定np.array的列表,计算最大元素。
电话:
最大=最大元素(输入列表)
输入:
input_list:np.array的列表,都需要有相同的长度。
输出:
Maximum:np.array的列表,其中包含输入_列表的最大元素,

使用的顺序是元素级的“公式中的
x
y
是什么?如果您找不到已经这样做的代码,那么是时候自己编写了。@PaxVobiscum OP定义
这个问题我不清楚。其中一个链接描述了一个非常简单的算法来解决这个问题。你就不能实现它吗?如果没有,问题是什么?请说得更具体些。@Code学徒啊,好的,他是说array x
[1 1 0]
[1 0 0]
[1 0 1]
[1 1 0]
[1 0 1]
import numpy as np

l = [np.array([1, 1, 0]), np.array([1, 0, 0]), np.array([0, 1, 1])]
l.sort(reverse=True, key=np.sum)
maximal = [l[0]]
for e in l:
    i = 0
    replaced = False
    while i < len(maximal):
        if (maximal[i] <= e).all():
            if replaced:
                maximal.remove(maximal[i])
            else:
                maximal[i] = e.copy()
                replaced = True
        if (e <= maximal[i]).all():
            break
        i += 1
    if i == len(maximal) and not replaced:
        maximal.append(e.copy())
import numpy as np

def maximal_elements(input_list):
  """Given a list of np.array, compute the maximal elements.

  Call:
    maximal = maximal_elements(input_list)
  Input:
    input_list: list of np.array, all need to have the same length.
  Output:
    maximal: list of np.array, which contains the maximal elements of input_list,
      the order used is elementwise "<="      
  """
  l = input_list.copy()
  l.sort(reverse=True, key=np.sum)
  maximal = [l[0]]
  for e in l[1:]:
    i = 0
    replaced = False
    while i < len(maximal):
      if (maximal[i] <= e).all():
        if replaced:
          maximal.pop(i)
          i -= 1
        else:
          maximal[i] = e.copy()
          replaced = True
      if (e <= maximal[i]).all():
        if not (e == maximal[i]).all():
          break
      i += 1
    if i == len(maximal) and not replaced:
      maximal.append(e.copy())
  return maximal

import itertools
import random
random.seed(2)
l = [np.array(e) for e in random.sample(list(itertools.product([0,1], repeat=5)), 9)]
maximal_elements(l)