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

如何更高效地扩展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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:45:01