我正在寻找python中的一种方法:一次只能通过矩阵的某些块进行置换。
具体来说,我想要一个矩阵,其中:
如果不是那么清楚,这是我想要的图像: http://s27.postimg.org/syimn1zvn/photo.jpg
其中P [i]是由以下一行定义的矩阵:
for per in itertools.permutations(range(n)):
matrix = [[0 for x in xrange(n)] for x in xrange(n)]
for i, j in enumerate(per):
matrix[i][j] = 1
print matrix
如果输入到矩阵中,其中一行不能给出满意的结果,我想用第二行替换该块。
现在,我做了类似的工作,我只使用拼接特定的行,然后运行所有可能的排列,例如:
row = list(perm_unique([1,0])) #this gives the unique permutations of the items
zs = list((0,0))
for a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 in product(row, repeat=12):
M, N, O, P, Q, R, = ([] for i in range(6))
M = list(chain(zs,a1,a2))
N = list(chain(zs,a3,a4))
O = list(chain(a5,zs,a6))
P = list(chain(a7,zs,a8))
Q = list(chain(a9,a10,zs))
R = list(chain(a11,a12,zs))
A = list()
A.append(M)
A.append(N)
A.append(O)
A.append(P)
A.append(Q)
A.append(R)
B = np.asarray(A)
不幸的是,我发现很难找到一个方法来执行相同的过程,但是使用块或小矩阵而不是简单的行。如果有人能给我任何想法或批评。我只学习了不到两周的Python代码,所以很想听听任何人的建议。
答案 0 :(得分:0)
当所有矩阵都是相等长度的列表列表时,您可以编写一个函数将子矩阵放在某个位置的较大矩阵上:
def place_submatrix(M, A, i, j):
"""Place submatrix A in M wit top left corner (i, j)"""
for ii in range(len(A)):
for jj in range(len(A)):
M[i + ii][j + jj] = A[ii][jj]
这不像L.append(X)
或L += [X]
那样动态。它要求已经存在适当大的矩阵。例如:
M = [[0 for x in xrange(9)] for x in xrange(9)]
A = [
[[44, 98, 23], [56, 93, 54], [83, 92, 72]],
[[72, 37, 58], [10, 17, 42], [40, 36, 74]],
[[48, 72, 39], [34, 98, 56], [87, 33, 66]],
[[90, 61, 16], [50, 98, 52], [81, 56, 77]],
[[13, 62, 86], [40, 53, 29], [39, 51, 14]],
[[23, 36, 91], [22, 76, 27], [58, 12, 91]]
]
pos = [(0, 3), (0, 6), (3, 0), (3, 6), (6, 0), (6, 3)]
for p, a in zip(pos, A):
row, col = p
place_submatrix(M, a, row, col)
然后在此处添加另一个循环以包含子矩阵列表A
。