获取符合条件的组合

2024-04-21

问题:我有一个表,我需要在其中提取行(或列,如果我转置表)的所有有效组合。列中只有值“+”或“-”,并且当组合中的至少一行中有“+”时,组合被认为是有效的,也就是说,所有行中带有“-”的任何组合都是无效的。

示例表:

   Guns  P_01 P_02 P_03 P_04 P_05 P_06 P_07
0  G_01    +    -    +    +    +    -    +
1  G_02    +    +    +    -    +    +    -
2  G_03    -    -    -    +    +    +    +
3  G_04    +    +    +    -    -    -    -
4  G_05    +    +    +    -    -    -    -
5  G_06    -    -    -    +    +    +    +
6  G_07    +    +    +    -    -    -    -

有效组合示例:

0  G_01    +    -    +    +    +    -    +
1  G_02    +    +    +    -    +    +    -

无效组合示例:

3  G_04    +    +    +    -    -    -    -
4  G_05    +    +    +    -    -    -    -

为了获得所有组合,我尝试使用 itertools 组合,并将结果放入列表中:

dfcomb =  [] 
dfcomb = df.apply(lambda r: list(combinations(r, 2)), axis=0)

Output:

         Guns     P_01    P_02    P_03    P_04    P_05    P_06    P_07
0   (G_01, G_02)  (+, +)  (-, +)  (+, +)  (+, -)  (+, +)  (-, +)  (+, -)
1   (G_01, G_03)  (+, -)  (-, -)  (+, -)  (+, +)  (+, +)  (-, +)  (+, +)
2   (G_01, G_04)  (+, +)  (-, +)  (+, +)  (+, -)  (+, -)  (-, -)  (+, -)
3   (G_01, G_05)  (+, +)  (-, +)  (+, +)  (+, -)  (+, -)  (-, -)  (+, -)
4   (G_01, G_06)  (+, -)  (-, -)  (+, -)  (+, +)  (+, +)  (-, +)  (+, +)
5   (G_01, G_07)  (+, +)  (-, +)  (+, +)  (+, -)  (+, -)  (-, -)  (+, -)
6   (G_02, G_03)  (+, -)  (+, -)  (+, -)  (-, +)  (+, +)  (+, +)  (-, +)
7   (G_02, G_04)  (+, +)  (+, +)  (+, +)  (-, -)  (+, -)  (+, -)  (-, -)
8   (G_02, G_05)  (+, +)  (+, +)  (+, +)  (-, -)  (+, -)  (+, -)  (-, -)
9   (G_02, G_06)  (+, -)  (+, -)  (+, -)  (-, +)  (+, +)  (+, +)  (-, +)
10  (G_02, G_07)  (+, +)  (+, +)  (+, +)  (-, -)  (+, -)  (+, -)  (-, -)
11  (G_03, G_04)  (-, +)  (-, +)  (-, +)  (+, -)  (+, -)  (+, -)  (+, -)
12  (G_03, G_05)  (-, +)  (-, +)  (-, +)  (+, -)  (+, -)  (+, -)  (+, -)
13  (G_03, G_06)  (-, -)  (-, -)  (-, -)  (+, +)  (+, +)  (+, +)  (+, +)
14  (G_03, G_07)  (-, +)  (-, +)  (-, +)  (+, -)  (+, -)  (+, -)  (+, -)
15  (G_04, G_05)  (+, +)  (+, +)  (+, +)  (-, -)  (-, -)  (-, -)  (-, -)
16  (G_04, G_06)  (+, -)  (+, -)  (+, -)  (-, +)  (-, +)  (-, +)  (-, +)
17  (G_04, G_07)  (+, +)  (+, +)  (+, +)  (-, -)  (-, -)  (-, -)  (-, -)
18  (G_05, G_06)  (+, -)  (+, -)  (+, -)  (-, +)  (-, +)  (-, +)  (-, +)
19  (G_05, G_07)  (+, +)  (+, +)  (+, +)  (-, -)  (-, -)  (-, -)  (-, -)
20  (G_06, G_07)  (-, +)  (-, +)  (-, +)  (+, -)  (+, -)  (+, -)  (+, -)

但现在我陷入困境,我知道我应该使用循环来验证任何组合是否有效,但我该怎么做呢?


如果您将 + 和 - 视为 True 和 False 并应用or每列的操作:

G_01    +    -    +    +    +    -    +
G_02    +    +    +    -    +    +    -
---------------------------------------
OR      +    +    +    +    +    +    +  ==> All true. This combo is valid

G_04    +    +    +    -    -    -    -
G_05    +    +    +    -    -    -    -
---------------------------------------
OR      +    +    +    -    -    -    -  ==> Not all true. This combo is invalid

唯一剩下的问题是如何快速比较它们。我们可以使用 numpy 的数组广播功能来做到这一点。简而言之,数组广播是对不同大小的数组执行操作的行为:

# When you compare an array to a scalar, the logical action is to compare
# every element of the array that scalar
[a, b, c] > d is equivalent to [a > d, b > d, c > d]

# If you want to compare every element of a list against every element of
# another list, things get a little tricky
[a, b, c] > [d, e] ???

# The trick is to raise the raise the second array up another dimension so you
# you can a comparison matrix. The first array remains 1D, the second array is
# now 2D
[a, b, c] > [[d], [e]]

# One way to visualize it
   d        e
a  a > d    a > e
b  b > d    b > e
c  c > d    c > e

这是您问题的答案:

# Life is a lot easier if you put Guns on the index
df.set_index('Guns', inplace=True)

# A 2D array of True/False
a = df.applymap(lambda x: x == '+').to_numpy()

# A 3D array to be used for in the OR operation
b = a[:, None]

# OR-ing every gun with every other gun
c = np.all(a | b, axis=-1)

# This is what c looks like, with some labels added
#        G_01   G_02   G_03   G_04   G_05   G_06   G_07
#      |------------------------------------------------
# G_01 | False   True  False  False  False  False  False    ==> (G_01, G_02) is valid
# G_02 |  True  False   True  False  False   True  False    ==> (G_02, G_01), (G_02, G_03) and (G_02, G_06) are valid
# G_03 | False   True  False   True   True  False   True
# G_04 | False  False   True  False  False   True  False
# G_05 | False  False   True  False  False   True  False
# G_06 | False   True  False   True   True  False   True
# G_07 | False  False   True  False  False   True  False

# Obviously (G_01, G_02) and (G_02, G_01) are the same combo so we don't need
# to collect both of them. We only need to work with the upper triangle in the
# matrix (`triu` means triangle upper)
valid_combinations = [(df.index[i], df.index[j]) for i,j in np.dstack(np.triu_indices_from(c))[0] if c[i][j]]

由于它使用 numpy 的广播,因此它受益于所有底层矢量化。我在不到 3 秒的时间内运行了 1000 x 1000 数据帧(1M 元素)。


Edit:要扩展它以覆盖任意大小的组合,您只需在每次迭代中不断提高比较矩阵:

def get_valid_combos(df, combo_size=2):
    assert combo_size >= 2, 'combo_size must be at least 2'

    a = df.applymap(lambda x: x == '+').to_numpy()
    result = a

    while combo_size > 1:
        a = a[:, None]
        result = result | a
        combo_size -= 1

    result = result.all(axis=-1)

    # Return True if array is monotonically increasing to avoid duplicates
    # like (G_1, G_2, G_3) and (G_1, G_3, G_2)
    is_increasing = lambda arr: (np.diff(arr) > 0).all()
    valid_indicies = np.array(result.nonzero()).transpose()
    return [tuple(df.index[idx]) for idx in valid_indicies if is_increasing(idx)]

请注意,这个数字呈指数增长。如果你有n枪,需要n ^ combo_size空间和可能n ^ (2 * combo_size)时间。有优化的机会:如果G_1 and G_2进行有效的组合,任何具有这两个的组合也是有效的,因此可以节省我们一些时间。但我现在太懒了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取符合条件的组合 的相关文章

随机推荐

  • 启动脚本似乎不起作用

    我最近开始在我的一些项目中使用 Google 的计算引擎 问题是我的启动脚本似乎不起作用 由于某种原因我的脚本不起作用 虚拟机具有启动脚本元数据并且工作正常当我手动运行它时 sudo google metadata script runne
  • 如何根据百分比更改imageview中的图像颜色并将颜色填充到该百分比

    如何根据百分比填充图像TextView 它应该根据百分比变化TextView 在下面的代码中 高度布局正在改变 但我希望图像的颜色应该根据百分比 textview 电池 的值 改变 CODE private void displayData
  • 如何将 NSTimer 与这个简单的 while 循环一起使用?

    我有一个正在执行的 void 方法 在某一时刻它会进入一个 while 循环 该循环在请求时直接从加速度计获取值 我浏览了有关 NSTimer 类的文档 但我无法理解在我的情况下如何准确地使用这个对象 e g void play if ac
  • 使用代码将 X509 证书添加到存储区

    此代码会将 x509 cer 证书文件添加到证书存储中 使用System Security Cryptography X509Certificates var filename Cert cer var cert new X509Certi
  • Selenium 服务器错误:无法获取浏览器

    我在 Windows 7 上运行 Selenium Standalone Server 2 25 并使用 Internet Explorer 9 作为浏览器 对于每个需要打开浏览器的测试 我都会收到此错误 Selenium WebDrive
  • 在复合组件的属性中使用EL

    我的 JSF 自定义组件代码
  • 在 Jest .toMatchObject 中包含 toBeCloseTo

    我正在测试一个对象是否与一组字段匹配 但其中一个是浮点 我需要使用 toBeClearTo https jestjs io docs en next expect tobeclosetonumber numdigits 怎么可能在一段时间之
  • r 中不包括 NA 的列长度

    假设我有一个data frame如下 a b c 1 5 NA 6 2 NA NA 7 3 6 5 8 我想找到每列的长度 不包括 NA 答案应该是这样的 a b c 2 1 3 到目前为止 我已经尝试过 is na Gives TRUE
  • Excel公式从日期中减去天数

    Excel中有没有办法让公式执行如下操作 12 20 2010 180 这需要特定日期 本例中为 12 20 2010 并减去 180 天 假设原始日期位于单元格 A1 中 DATE YEAR A1 MONTH A1 DAY A1 180
  • 为什么 jquery 脚本不工作?

    为什么 jQuery 脚本可以在我的 jsfiddle 中运行 但不能在我的页面中运行 我所做的 尝试了不同版本的 JQuery 制作了脚本 所以我有这个测试页面 头部部分
  • 如何使用 Xcode 5 本地化我的应用程序?

    这是关于的后续问题 和答案 如何使用 Xcode 4 本地化我的应用程序 https stackoverflow com questions 5349066 how to localize my app with xcode 4 11282
  • Angular 2:实现自定义上下文菜单

    我正在实现 Angular 2 属性指令 以允许我向元素添加自定义上下文菜单 如下所示 p Hello world p 该指令添加了一个鼠标事件处理程序来捕获右键单击 其想法是构建一个上下文菜单 将其添加到 DOM 然后在用户完成操作时销毁
  • Clojure gen-class 返回自己的类

    我现在正在使用 Clojure 创建一个类对象 它有一个返回对象本身的方法 用Java编写的 我想要制作的对象是这样的 class Point public double x public double y public Point dou
  • 静态与非静态方法

    假设您有一些可以在非静态类中设为静态的方法 例如 private double power double a double b return Math Pow a b 您认为将方法签名更改为静态有什么好处吗 在上面的例子中 private
  • docker-compose 相当于 docker run --init 吗?

    根据https github com krallin tini using tini https github com krallin tini using tini tini内置于docker中 可以通过传递 init标记为docker
  • docker 容器中 PostgreSQL 的权限问题

    我正在尝试使用 PostgreSQL 运行一个 docker 映像 该映像配置了一个用于持久数据的卷 docker compose yml version 3 1 services db image postgres restart alw
  • 启动 StepFunction 并退出不会触发执行

    我有 Lambda 函数tranportKickoff它接收输入 然后将输入发送 代理到阶跃函数 下面的代码does运行 我没有收到任何错误 但同时步骤函数没有执行 对于设计也很重要 我不希望transportKickoff函数等待步骤函数
  • Mongoose Population: CastError: 路径“_id”处的值“[object Object]”转换为 ObjectId 失败

    遇到一个CastError在 Mongoose 中填充嵌套 ObjectId 引用时 值 显然是valid 只要它们在保存到架构时不会被阻止 有兴趣在服务器端解决此问题以防止将来出现格式错误的数据 但是 我知道不从客户端保存这些值是一个好主
  • java 是否存在只有键没有值的哈希结构?

    我正在寻找一种无需值即可对键进行哈希处理的结构 查询时 如果找到密钥 则应返回 true 否则返回 false 我正在寻找类似的东西Hashtable
  • 获取符合条件的组合

    问题 我有一个表 我需要在其中提取行 或列 如果我转置表 的所有有效组合 列中只有值 或 并且当组合中的至少一行中有 时 组合被认为是有效的 也就是说 所有行中带有 的任何组合都是无效的 示例表 Guns P 01 P 02 P 03 P