如何高效取反二维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
相关产品推荐
相关产品推荐

