Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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_Arrays_Matrix_Permutation - Fatal编程技术网

用Python生成二维数组的置换矩阵

用Python生成二维数组的置换矩阵,python,arrays,matrix,permutation,Python,Arrays,Matrix,Permutation,我想为输入d(一个素数)生成所有的平方置换矩阵。我知道有一些例子说明了如何对所有的置换进行处理,但我正在寻找满足数学定义的置换矩阵 置换矩阵是通过根据数字1到d的某种置换对dxd恒等式矩阵的行进行置换而获得的矩阵。因此,每一行和列都精确地包含一个1,其他地方都是0 e、 对于2x2,[[1,0],[0,1]]和[[0,1],[1,0]]满足此条件,而[[1,1],[0,0]]等。。。不要,所以我希望这不是一个重复的问题。我有一个这样做的代码,我的测试是,我应该有d!矩阵。当我到11岁时,我应该得

我想为输入d(一个素数)生成所有的平方置换矩阵。我知道有一些例子说明了如何对所有的置换进行处理,但我正在寻找满足数学定义的置换矩阵

置换矩阵是通过根据数字1到d的某种置换对dxd恒等式矩阵的行进行置换而获得的矩阵。因此,每一行和列都精确地包含一个1,其他地方都是0

e、 对于2x2,[[1,0],[0,1]]和[[0,1],[1,0]]满足此条件,而[[1,1],[0,0]]等。。。不要,所以我希望这不是一个重复的问题。我有一个这样做的代码,我的测试是,我应该有d!矩阵。当我到11岁时,我应该得到11岁!但是我得到一个错误,我的代码由于内存丢失而关闭。我希望有人有一个更有效的方法来解决这个问题,因为我想去更大的素数

import math
import numpy as np
import cmath
from sympy.utilities.iterables import multiset_permutations
from itertools import permutations, chain
from pprint import pprint
from numpy import ndarray
from numpy import linalg as LA


d=5
print("Prime dimension",d)
a=[1]+[0 for _ in range(d-1)]
N=[] 
P=[]
Pdagger=[]
for p in multiset_permutations(a):
    N.append(p)

#Generate a list of ALL the permutation matrices including Identity (last)
for n in multiset_permutations(N):
    n
    P.append(n)
print(len(P))

我正在IPython Jupyter笔记本上运行我的代码,如果这样有帮助的话。我知道这可能不是最好/最有效的运行方式,但我正在寻找任何人可以给我的建议。顶部导入的所有库都与后面的代码相关。

太大,无法添加注释。以下是我的想法:

import itertools

def I(n):
    A = []
    for i in range(n):
        A.append([1 if j == i else 0 for j in range(n)])
    return A

#tests:

A = I(3)

for m in itertools.permutations(A):
    print('\n'.join(str(row) for row in m))
    print('')

A = I(11)
count = 0
for m in itertools.permutations(A):
    count = count + m[0][0] #for testing purposes
print(count)
输出:

[1, 0, 0]
[0, 1, 0]
[0, 0, 1]

[1, 0, 0]
[0, 0, 1]
[0, 1, 0]

[0, 1, 0]
[1, 0, 0]
[0, 0, 1]

[0, 1, 0]
[0, 0, 1]
[1, 0, 0]

[0, 0, 1]
[1, 0, 0]
[0, 1, 0]

[0, 0, 1]
[0, 1, 0]
[1, 0, 0]

3628800

这需要大约10秒的时间运行,最终的数字是11/11(这很有道理)。

11!11x11矩阵总共包含近50亿个条目,在置换矩阵的情况下,大多数条目为0。为什么不为它们编写一个生成器呢?对不起,你能进一步解释一下吗?也许我要回答的问题需要更多的背景!11! 11x11矩阵对于大多数机器来说太多了,无法立即保存在内存中。想必你不会无缘无故地尝试这样做,而是要对它们进行迭代。Python中的生成器是一个惰性列表,它动态生成元素。您应该能够编写一个生成器,例如,您可以在置换矩阵(11)中有一个循环,它的开头类似于M的
如果
a
是表示为行列表的11x11标识矩阵,则
itertools。置换(a)
已经是所有置换矩阵的迭代器。为什么要将它们全部组装到一个数千兆字节的列表中呢?这更有意义。在这一点上,我没有理由把排列矩阵保存在内存中。排列矩阵是它们的列表吗?另外,你所说的
A
,是指我的代码中的
A
?对于d=3,
a=[1,0,0]
,然后
N=[1,0,0],[0,1,0],[0,0,1]
,和
P
是一个矩阵列表,其中N行已被排列。所以我不确定我是否理解你的评论。我也为一些显而易见的问题道歉。谢谢。我们怎么会有11个/11? 这个数字和我的问题d一样熟悉/d是我们拥有的等价类的数量(我计划减少问题规模的一种方法)。但是,我不知道为什么会出现这种情况-为什么我们只计算左上角元素条目为1的矩阵?在我的迭代过程中,我在这里想象,我在这个循环中构建了另一个循环,在这里我将m作为置换矩阵向前推进。我只是在计算左上角有1的矩阵——11个矩阵中有1个具有这个属性。这是一个随机测试——我只是想对生成的每个矩阵做些什么。