如何解决在 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 填充。
您可以使用 n
为 itertools.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 举报,一经查实,本站将立刻删除。