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

如何高效取反二维NumPy数组的次对角元素?

如何高效对二维NumPy数组的次对角元素取反?

这里的次对角元素指的是从数组右上角到左下角的反对角线元素(对于n×n方阵,满足索引关系 i + j = n-1,其中i是行索引,j是列索引)。以下是几种高效的实现方式,全部基于NumPy的向量化操作,避免循环,性能最优:

1. 方阵场景(最常见)

直接生成次对角元素的行、列索引,通过索引赋值完成取反:

import numpy as np

# 创建示例方阵
arr = np.array([[1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]])

n = arr.shape[0]
# 生成次对角的行索引和列索引
rows = np.arange(n)
cols = n - 1 - rows

# 原地对次对角元素取反
arr[rows, cols] = -arr[rows, cols]

print(arr)
# 输出结果:
# [[ 1  2 -3]
#  [ 4 -5  6]
#  [-7  8  9]]

如果不想修改原数组,先创建副本再操作:

arr_copy = arr.copy()
arr_copy[rows, cols] = -arr_copy[rows, cols]

2. 非方阵场景

对于m×n的非方阵,需要先指定要操作的反对角线(即满足i + j = k的元素集合,k为自定义的常数),再生成对应索引:

import numpy as np

# 创建3行4列的非方阵
arr = np.array([[1, 2, 3, 4],
                [5, 6, 7, 8],
                [9, 10, 11, 12]])

# 选择要操作的反对角线,这里取i+j=2的元素
k = 2
# 计算有效行索引范围
rows = np.arange(max(0, k - (arr.shape[1]-1)), min(arr.shape[0], k+1))
cols = k - rows

# 对目标反对角线元素取反
arr[rows, cols] = -arr[rows, cols]

print(arr)
# 输出结果:
# [[ 1  2 -3  4]
#  [ 5 -6  7  8]
#  [-9 10 11 12]]

为什么推荐这些方法?

这些方法完全基于NumPy的向量化索引操作,底层由C实现,比Python循环快几个数量级,是处理NumPy数组元素最高效的方式之一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:00:43