Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.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_Numpy_Array Broadcasting - Fatal编程技术网

Python 映照出一片黑暗

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

我有一个多维度的数组(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:
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]]