如何在python中进行置换矩阵乘法?
How to perform permutation matrix multiplication in python?
置换矩阵 A 和 B 是方阵,每行仅包含一个 1。所有行都是唯一的。
我已经添加了我的第一次尝试作为答案。我希望有人有更快的解决方案。
def permmult(a, b):
"""Multiply two permutation matrices.
a,b: lists of positive integers and zero."""
c = []
for row in a:
c.append(b[-row])
return c
迄今为止我取得的最好成绩...
def permmult(a, b):
"""Multiply two permutation matrices.
a,b: lists of positive integers and zero."""
c = []
for row in a:
c.append(b[-row])
return c
即使不是更快,也更短:
def permmult(a,b):
return [b[-r] for r in a]
置换矩阵是一个很好的数学概念,但它们不是您以编程方式对向量中的元素重新排序的方式(除非您尝试使用 numpy 做一些特殊的事情)。
从重新排序的索引向量 (K) 创建置换矩阵 (P) 可以像这样完成:
def pMatBuild(A):
return [ [int(a==b) for b in range(len(A))] for a in A ]
K = [0,3,1,4,2]
P = pMatBuild(K)
输出:
for line in P: print(line)
[1, 0, 0, 0, 0]
[0, 0, 0, 1, 0]
[0, 1, 0, 0, 0]
[0, 0, 0, 0, 1]
[0, 0, 1, 0, 0]
将此置换矩阵应用于另一个向量(即相乘)可以像这样完成:
def pMatApply(P,V):
return [ V[row.index(1)] for row in P ] # inefficient lookup of 1 on each row
输出:
V = "ABCDE"
print(pMatApply(P,V))
['A', 'D', 'B', 'E', 'C']
但是,在代码中,比置换矩阵更有效的是使用原始索引向量 K:
V = "ABCDE"
print([V[i] for i in K])
['A', 'D', 'B', 'E', 'C']
置换矩阵 A 和 B 是方阵,每行仅包含一个 1。所有行都是唯一的。 我已经添加了我的第一次尝试作为答案。我希望有人有更快的解决方案。
def permmult(a, b):
"""Multiply two permutation matrices.
a,b: lists of positive integers and zero."""
c = []
for row in a:
c.append(b[-row])
return c
迄今为止我取得的最好成绩...
def permmult(a, b):
"""Multiply two permutation matrices.
a,b: lists of positive integers and zero."""
c = []
for row in a:
c.append(b[-row])
return c
即使不是更快,也更短:
def permmult(a,b):
return [b[-r] for r in a]
置换矩阵是一个很好的数学概念,但它们不是您以编程方式对向量中的元素重新排序的方式(除非您尝试使用 numpy 做一些特殊的事情)。
从重新排序的索引向量 (K) 创建置换矩阵 (P) 可以像这样完成:
def pMatBuild(A):
return [ [int(a==b) for b in range(len(A))] for a in A ]
K = [0,3,1,4,2]
P = pMatBuild(K)
输出:
for line in P: print(line)
[1, 0, 0, 0, 0]
[0, 0, 0, 1, 0]
[0, 1, 0, 0, 0]
[0, 0, 0, 0, 1]
[0, 0, 1, 0, 0]
将此置换矩阵应用于另一个向量(即相乘)可以像这样完成:
def pMatApply(P,V):
return [ V[row.index(1)] for row in P ] # inefficient lookup of 1 on each row
输出:
V = "ABCDE"
print(pMatApply(P,V))
['A', 'D', 'B', 'E', 'C']
但是,在代码中,比置换矩阵更有效的是使用原始索引向量 K:
V = "ABCDE"
print([V[i] for i in K])
['A', 'D', 'B', 'E', 'C']