Python 映照出一片黑暗
我有一个多维度的数组(N*N*M),我想在主对角线上有效地镜像它。 对于N=1,我做了以下工作:Python 映照出一片黑暗,python,arrays,numpy,array-broadcasting,Python,Arrays,Numpy,Array Broadcasting,我有一个多维度的数组(N*N*M),我想在主对角线上有效地镜像它。 对于N=1,我做了以下工作: A = np.array([[1, 0, 6, 5], [0, 2, 0, 0], [1, 0, 2, 0], [0, 1, 0, 3]]) A = np.tril(A) + np.triu(A.T, 1) ''' From: array([[1, 0, 6, 5], [0, 2, 0, 0], [1, 0, 2, 0], [0, 1, 0, 3]]) To
A = np.array([[1, 0, 6, 5], [0, 2, 0, 0], [1, 0, 2, 0], [0, 1, 0, 3]])
A = np.tril(A) + np.triu(A.T, 1)
'''
From:
array([[1, 0, 6, 5],
[0, 2, 0, 0],
[1, 0, 2, 0],
[0, 1, 0, 3]])
To:
array([[1, 0, 1, 0],
[0, 2, 0, 1],
[1, 0, 2, 0],
[0, 1, 0, 3]])
'''
但是这(np.tril
和np.triu
)不适用于更高维度,例如
A = np.array([[[1], [0], [6], [5]], [[0], [2],[0], [0]], [[1], [0], [2], [0]], [[0], [1], [0], [3]]]) # (4,4,1)
A = np.array([[[1,2], [0,3], [6,5], [5,6]], [[0,3], [2,2],[0,1], [0,3]], [[1,5], [0,2], [2,1], [0,9]], [[0,1], [1,2], [0,2], [3,4]]]) # (4,4,2)
有什么办法可以有效地做到这一点(无需for循环)?我不介意镜像矩阵的底部或顶部三角形这是一种简单的方法:
将numpy导入为np
#示例数据,形状(4,4,2)
a=np.array([[1,2],[0,3],[6,5],[5,6],
[[0, 3], [2, 2], [0, 1], [0, 3]],
[[1, 5], [0, 2], [2, 1], [0, 9]],
[[0, 1], [1, 2], [0, 2], [3, 4]]])
#1的下三角形,形状(4,4,1)
tril=np.tril(np.one(a.shape[:-1],a.dtype))[…,np.newaxis]
#具有额外尺寸和形状的眼睛矩阵(4,4,1)
eye=np.eye(a.shape[0],dtype=a.dtype)[……,np.newaxis]
#下三角
心房=a*tril
#添加上部三角形并删除两次添加的对角线
结果=心房+心房swapaxes(0,1)-a*眼
#检查结果
打印(结果[…,0])
# [[1 0 1 0]
# [0 2 0 1]
# [1 0 2 0]
# [0 1 0 3]]
打印(结果[…,1])
# [[2 3 5 1]
# [3 2 2 2]
# [5 2 1 2]
# [1 2 2 4]]