You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用向量填充3D numpy数组中每个矩阵的对角线

问题描述

现有一个3D NumPy数组,其中每个2D切片代表一个独立矩阵。需要将每个矩阵的对角线元素替换为一组特定值。

例如,对于一个3x3x3的数组:

import numpy as np
arr = np.array([[[a1, a2, a3],
                 [a4, a5, a6],
                 [a7, a8, a9]],

                [[b1, b2, b3],
                 [b4, b5, b6],
                 [b7, b8, b9]],

                [[c1, c2, c3],
                 [c4, c5, c6],
                 [c7, c8, c9]]])

需要把每个子矩阵的对角线[a1, a5, a9]、[b1, b5, b9]和[c1, c5, c9]分别替换为对应的新值,该如何实现?

解决方案

方法1:向量化高级索引(高效推荐)

假设你有一个形状为(n, m, m)的3D数组,以及一个对应新对角线值的(n, m)数组new_diags,可以通过索引直接定位所有对角线元素并赋值:

import numpy as np

# 示例原数组
arr = np.array([[[1,2,3], [4,5,6], [7,8,9]],
                [[10,11,12], [13,14,15], [16,17,18]],
                [[19,20,21], [22,23,24], [25,26,27]]])

# 新对角线值:每行对应一个子矩阵的对角线
new_diags = np.array([[0, 0, 0], [1,1,1], [2,2,2]])

# 生成索引:i对应第几个矩阵,j对应对角线的行/列位置
i = np.arange(arr.shape[0])[:, None]
j = np.arange(arr.shape[1])

# 批量赋值
arr[i, j, j] = new_diags

这种方法完全利用NumPy的向量化操作,避免循环,处理大数组时效率远超循环。

方法2:循环逐个处理(直观易懂)

如果更倾向于直观的逻辑,可以遍历每个2D子矩阵,用np.fill_diagonal替换对角线:

import numpy as np

arr = np.array([[[1,2,3], [4,5,6], [7,8,9]],
                [[10,11,12], [13,14,15], [16,17,18]],
                [[19,20,21], [22,23,24], [25,26,27]]])

new_diags = [[0,0,0], [1,1,1], [2,2,2]]

for mat_idx in range(arr.shape[0]):
    np.fill_diagonal(arr[mat_idx], new_diags[mat_idx])

这种写法逻辑清晰,适合刚接触NumPy的开发者,小尺寸数组下性能差异可以忽略。

内容的提问来源于stack exchange,提问作者Peyman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:13:40