如何在Python的Numpy数组中填充过指定点的副对角线?
在Numpy中填充经过指定点的副对角线元素为1
要实现将Numpy全0数组中经过指定点P=(p1,p2)的副对角线元素全部设为1,核心思路是找到所有满足行索引+列索引 = p1+p2的位置(这类位置构成一条副对角线),再将这些位置赋值为1。
实现步骤
- 创建指定形状的全0Numpy数组;
- 计算目标副对角线的索引和:
diag_sum = p1 + p2; - 生成数组的行、列索引网格,筛选出满足
行索引+列索引=diag_sum的位置; - 将筛选出的位置赋值为1。
代码示例
import numpy as np # 示例1:处理点P=(1,4),5x5数组 arr1 = np.zeros((5, 5), dtype=int) p1, p2 = 1, 4 diag_sum = p1 + p2 rows, cols = arr1.shape row_idx, col_idx = np.indices((rows, cols)) # 生成掩码,筛选目标副对角线位置 mask = (row_idx + col_idx) == diag_sum arr1[mask] = 1 print("P=(1,4)的结果数组:") print(arr1) # 示例2:处理点P=(3,0),5x5数组 arr2 = np.zeros((5, 5), dtype=int) p1, p2 = 3, 0 diag_sum = p1 + p2 row_idx, col_idx = np.indices(arr2.shape) mask = (row_idx + col_idx) == diag_sum arr2[mask] = 1 print("\nP=(3,0)的结果数组:") print(arr2)
运行结果
执行上述代码后,输出与题目示例完全一致:
P=(1,4)的结果数组: [[0 0 0 0 0] [0 0 0 0 1] [0 0 0 1 0] [0 0 1 0 0] [0 1 0 0 0]] P=(3,0)的结果数组: [[0 0 0 1 0] [0 0 1 0 0] [0 1 0 0 0] [1 0 0 0 0] [0 0 0 0 0]]
扩展说明
- 该方法适用于任意形状的Numpy数组(非方阵也可),会自动筛选出数组范围内有效的索引位置;
- 利用Numpy的向量化操作,效率远高于循环遍历,适合处理大规模数组。
内容的提问来源于stack exchange,提问作者Harshaan Niles
相关产品推荐
相关产品推荐

