如何在 Numpy Python 中将 4 维数组的下三角形复制到上三角形?

问题描述 投票:0回答:2

目标是将下三角形复制到上三角形。 根据OP中提出的建议,起草了以下代码。

import numpy as np

lw_up_pair = np.tril_indices(4, -1)
arr=np.zeros((4,4,1,1))

arr[1,:1,:,0]=1
arr[2,:2,0,0]=2
arr[3,:3,0,0]=3
arr = arr + arr.T - np.diag(np.diag(arr))

但是,它给出了错误

ValueError:输入必须是 1 维或 2 维。

我可以知道如何处理这个问题吗?

预期输出如下

[[[0.]],, [[1.]],, [[2.]],, [[3.]]]
[[[1.]],, [[0.]],, [[2.]],, [[3.]]]
[[[2.]],, [[2.]],, [[0.]],, [[3.]]]
[[[3.]],, [[3.]],, [[3.]],, [[0.]]]
python numpy triangular
2个回答
1
投票

在执行三角形复制之前,应用“挤压”来挤出最后两个轴(每个轴的长度为 1)。

这给你留下了一个二维数组。

然后,在执行三角形复制后,重新引入您挤出的轴:

arr = np.squeeze(arr)
arr = arr + arr.T - np.diag(np.diag(arr))
arr = arr[...,None, None]

0
投票
import numpy as np

lw_up_pair = np.tril_indices(4, -1)
arr=np.zeros((4,4,1,1))

arr[1,:1,:,0]=1
arr[2,:2,0,0]=2
arr[3,:3,0,0]=3

print(arr.shape)#(4, 4, 1, 1)

symmetric_matrix = arr  + arr.T 

diagonal_value = arr[0, 0, 0, 0]  # Get the first element (diagonal value)
np.fill_diagonal(symmetric_matrix, diagonal_value)

#change the diagonal to the Original matrix 
print(symmetric_matrix.shape)#(4, 4, 4, 4)
print(symmetric_matrix)
'''
[[[[0. 1. 2. 3.]
   [0. 0. 2. 3.]
   [0. 0. 0. 3.]
   [0. 0. 0. 0.]]

  [[0. 1. 2. 3.]
   [0. 0. 2. 3.]
   [0. 0. 0. 3.]
   [0. 0. 0. 0.]]

  [[0. 1. 2. 3.]
   [0. 0. 2. 3.]
   [0. 0. 0. 3.]
   [0. 0. 0. 0.]]

  [[0. 1. 2. 3.]
   [0. 0. 2. 3.]
   [0. 0. 0. 3.]
   [0. 0. 0. 0.]]]


 [[[1. 2. 3. 4.]
   [1. 1. 3. 4.]
   [1. 1. 1. 4.]
   [1. 1. 1. 1.]]

  [[0. 1. 2. 3.]
   [0. 0. 2. 3.]
   [0. 0. 0. 3.]
   [0. 0. 0. 0.]]

  [[0. 1. 2. 3.]
   [0. 0. 2. 3.]
   [0. 0. 0. 3.]
   [0. 0. 0. 0.]]

  [[0. 1. 2. 3.]
   [0. 0. 2. 3.]
   [0. 0. 0. 3.]
   [0. 0. 0. 0.]]]


 [[[2. 3. 4. 5.]
   [2. 2. 4. 5.]
   [2. 2. 2. 5.]
   [2. 2. 2. 2.]]

  [[2. 3. 4. 5.]
   [2. 2. 4. 5.]
   [2. 2. 2. 5.]
   [2. 2. 2. 2.]]

  [[0. 1. 2. 3.]
   [0. 0. 2. 3.]
   [0. 0. 0. 3.]
   [0. 0. 0. 0.]]

  [[0. 1. 2. 3.]
   [0. 0. 2. 3.]
   [0. 0. 0. 3.]
   [0. 0. 0. 0.]]]


 [[[3. 4. 5. 6.]
   [3. 3. 5. 6.]
   [3. 3. 3. 6.]
   [3. 3. 3. 3.]]

  [[3. 4. 5. 6.]
   [3. 3. 5. 6.]
   [3. 3. 3. 6.]
   [3. 3. 3. 3.]]

  [[3. 4. 5. 6.]
   [3. 3. 5. 6.]
   [3. 3. 3. 6.]
   [3. 3. 3. 3.]]

  [[0. 1. 2. 3.]
   [0. 0. 2. 3.]
   [0. 0. 0. 3.]
   [0. 0. 0. 0.]]]]

'''
© www.soinside.com 2019 - 2024. All rights reserved.