如何更高效地扩展Numpy方阵?寻求现有方法的优化方案
向方阵插入一行一列的更优实现方式
你当前用np.insert的方式可行,但如果要直接操作预先分配好的数组,切片赋值是比掩码更高效且直观的方案——你的掩码写法失败,是因为expanded_m1[m1_mask]的扁平化索引和m1的元素顺序不匹配,导致元素错位。
直接切片赋值实现
预先创建目标形状的数组,通过切片把原矩阵、新增行、新增列放到对应位置:
import numpy as np m1 = np.array([[1,3,4,5], [11,13,14,15], [16,18,19,20], [21,23,24,25] ]) row_1 = np.array([6,8,9,10]) col_1 = np.array([2,7,12,17,22]) # 预先分配目标数组 m2 = np.zeros((m1.shape[0]+1, m1.shape[1]+1)) # 复制原矩阵到对应位置:跳过第1行和第1列 m2[:1, :1] = m1[:1, :1] # 左上角块 m2[:1, 2:] = m1[:1, 1:] # 右上角块 m2[2:, :1] = m1[1:, :1] # 左下角块 m2[2:, 2:] = m1[1:, 1:] # 右下角块 # 插入新增行和列 m2[1, 2:] = row_1 # 新增行(除第1列) m2[:, 1] = col_1 # 新增列 print(f'{m2=}')
简化切片写法
用np.r_生成连续索引,简化原矩阵的复制逻辑:
m2 = np.zeros((m1.shape[0]+1, m1.shape[1]+1)) # 复制原矩阵:跳过第1行和第1列的位置 m2[np.r_[:1, 2:m2.shape[0]], np.r_[:1, 2:m2.shape[1]]] = m1 # 赋值新增行(注意新增行的第1列对应col_1的第1个元素) m2[1, :] = np.insert(row_1, 1, col_1[1]) # 赋值新增列 m2[:, 1] = col_1 print(f'{m2=}')
掩码写法失败原因
当执行expanded_m1[m1_mask] = m1时,m1_mask中为1的位置会被扁平化处理,而m1的元素也是按行优先扁平化,但这两个扁平化序列的元素位置并不对应。比如原矩阵的m1[0,1]应该放到expanded_m1[0,2],但掩码的扁平化索引顺序和m1的扁平化顺序不匹配,最终导致赋值结果混乱。
性能优势
切片赋值的效率远高于np.insert:np.insert会多次创建新数组并复制数据,而预先分配数组后做切片赋值,只需要一次内存分配和几次连续内存复制操作,大矩阵场景下性能提升明显。
内容的提问来源于stack exchange,提问作者Jordan Larson
相关产品推荐
相关产品推荐

