目标是将下三角形复制到上三角形。 根据 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-d。
我可以吗知道如何处理这个问题吗?
预期输出如下
[[[0.]],, [[1.]],, [[2.]],, [[3.]]]
[[[1.]],, [[0.]],, [[2.]],, [[3.]]]
[[[2.]],, [[2.]],, [[0.]],, [[3.]]]
[[[3.]],, [[3.]],, [[3.]],, [[0.]]]
错误“ValueError:输入必须为1-或2-d。”来自你在多维数组上使用
np.diag()
的方式。
np.diag()
在 1-D 数组上使用时用于提取矩阵的对角线,在 2-D 数组上使用时用于从对角线创建对角矩阵。你的数组是 4-D 的,因此它失败了。
你可以通过使用高级索引来实现这一点,而无需使用
np.diag()
:
import numpy as np
# 创建示例数组
arr = np.zeros((4, 4, 1, 1))
arr[1, :1, :, 0] = 1
arr[2, :2, 0, 0] = 2
arr[3, :3, 0, 0] = 3
# 获取下三角和上三角的索引
lw_up_pair = np.tril_indices(4, -1)
up_lw_pair = (lw_up_pair[1], lw_up_pair[0])
# 将下三角复制到上三角
arr[up_lw_pair] = arr[lw_up_pair]
print(arr)
这将产生所需的输出:
[[[[0.]]
[[1.]]
[[2.]]
[[3.]]]
[[[1.]]
[[0.]]
[[2.]]
[[3.]]]
[[[2.]]
[[2.]]
[[0.]]
[[3.]]]
[[[3.]]
[[3.]]
[[3.]]
[[0.]]]]
这段代码的工作原理如下:
- 获取下三角和上三角的索引:
-
np.tril_indices(4, -1)
返回一个包含下三角索引的元组(rows, cols)
,不包括主对角线。 -
我们通过反转
lw_up_pair
中的 rows 和 cols 索引来获得上三角的相应索引,将其存储在up_lw_pair
中。 -
将下三角复制到上三角:
- 我们使用高级索引直接将下三角的值分配给上三角,利用了计算出的索引。
这种方法避免使用
np.diag()
,并通过直接索引操作有效地解决了该问题。