在 w x h 矩阵中生成 n 个条目的所有排列

如何解决在 w x h 矩阵中生成 n 个条目的所有排列

我想在 w x h 矩阵中生成 n 个条目的所有排列: 具有 2x2 矩阵且 n = 1 的示例:

| 1 0 |
| 0 0 |

| 0 1 |
| 0 0 |

| 0 0 |
| 1 0 |

| 0 0 |
| 0 1 |

具有 3x3 矩阵且 n = 2(部分)的示例:

| 0 0 1|
| 0 0 1|
| 0 0 0|

| 1 0 0|
| 0 0 1|
| 0 0 0|

...

我想避免使用 numpy,所以我认为 itertool 是要走的路。 我正在研究一维解决方案,但我得到的只是一些略有不同的东西,比如使用固定数量的值进行迭代的 itertools.product,例如

itertools.product([0,'n'],repeat=6)

[(0,0),....('n','n','n')]

如有任何提示,我们将不胜感激

解决方法

w * h 个可用位置,您要在其中放置 n 个 1,其余位置用 0 填充。

您可以使用 nitertools.combinations 1 创建所有可能的位置组合:

>>> w = 2
>>> h = 2
>>> n = 2
>>> list(itertools.combinations(range(w * h),n))
[(0,1),(0,2),3),(1,(2,3)]

要从位置元组之一创建实际矩阵(作为 1 和 0 的列表),您可以例如使用列表理解:

>>> positions = (1,3)
>>> [1 if i in positions else 0 for i in range(w * h)]
[0,1,1]

对于非常大的 n,查找 i in positions 变得效率低下,最好将其更改为如下函数:

def create_matrix(positions):
    matrix = [0] * w * h
    for i in positions:
        matrix[i] = 1
    return matrix

现在您可以将所有内容放在一起:

>>> [[1 if i in p else 0 for i in range(w * h)]
...  for p in itertools.permutations(range(w * h),n)]
[[1,0],[1,1],[0,1]]

或者,如果您使用 create_matrix 函数:

>>> [create_matrix(p) for p in itertools.permutations(range(w * h),n)]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?