如何高效删除 NumPy 二维数组中所有元素相同的列
技术百科
霞舞
发布时间:2026-01-01
浏览: 次 本文介绍如何安全、准确地删除 n
umpy 二维数组中所有值完全相同的列,避免因边遍历边修改导致的索引错位问题,并提供向量化优化方案。
在处理二维数组时,常需剔除冗余列(例如某列所有元素均为同一值),但直接在循环中调用 np.delete() 修改数组会引发索引偏移——因为每次删除都会改变后续列的列索引位置,导致漏删或越界错误。
原始代码的问题正在于此:for col_idx in range(arr_2d.shape[1]) 生成的是初始列数范围(0 到 5),但随着 np.delete() 执行,arr_2d_copy 列数动态减少,而 col_idx 仍按原顺序递增,最终可能尝试删除已不存在的列,或跳过本应检查的列。
✅ 正确做法是两阶段策略:先扫描识别所有待删列索引,再一次性批量删除。以下是修正后的清晰实现:
import numpy as np
arr_2d = np.array([[ 1, 2, 4, 9, 3, 10],
[ 1, 3, 4, 12, 3, 15],
[ 1, 6, 4, 16, 3, 22],
[ 1, 10, 4, 21, 3, 30]])
# 第一阶段:收集所有“全列相同”的列索引
indices_to_delete = []
for col_idx in range(arr_2d.shape[1]):
# 比较该列所有元素是否等于首元素
if np.all(arr_2d[:, col_idx] == arr_2d[0, col_idx]):
indices_to_delete.append(col_idx)
print(f'Column {col_idx}: Same? {indices_to_delete[-1] == col_idx if indices_to_delete and indices_to_delete[-1] == col_idx else False}')
# 第二阶段:一次性删除(axis=1 表示按列删除)
result = np.delete(arr_2d, indices_to_delete, axis=1)
print("Result:")
print(result)输出:
Result: [[ 2 9 10] [ 3 12 15] [ 6 16 22] [10 21 30]]
? 进阶优化:使用向量化替代显式循环
NumPy 提供更高效、更简洁的写法,无需 Python 循环:
# 向量化判断:每列是否所有元素相等
# arr_2d == arr_2d[0, :] 广播比较 → shape (4, 6)
# .all(axis=0) 沿行方向取“全为True” → 得到长度为6的布尔数组
mask = np.all(arr_2d == arr_2d[0, :], axis=0)
# 取反后保留非全同列
result_vectorized = arr_2d[:, ~mask]
print("Vectorized result:")
print(result_vectorized)⚠️ 注意事项:
- np.all(arr_2d[:,col_idx] == arr_2d[:,col_idx][0]) 中 [0] 可简写为 [0] 或直接用 arr_2d[0, col_idx],语义更清晰;
- 若数组含 NaN,== 比较会返回 False,需改用 np.all(np.isnan(arr_2d[:, col_idx])) or np.all(arr_2d[:, col_idx] == arr_2d[0, col_idx]) 处理;
- 批量删除比逐次删除性能更高,尤其对大数组;向量化方案在内存和速度上均更优。
总结:删除同值列的核心在于分离“检测”与“删除”逻辑,优先推荐向量化 mask 方案——简洁、健壮、高效。
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Windows电脑键盘突然失灵怎么办?(驱动与硬件
- 如何使用Golang defer优化性能_减少不必
- Flask 表单数据通过 SMTP 发送邮件的完整
- 如何在Golang中解压文件_Golang com
- Win11开始菜单打不开_修复Windows 11
- 如何在 Go 开发中正确处理本地包导入与远程模块路
- php下载安装包怎么选_threadsafe与nt
- 如何有效拦截拼接式恶意域名的垃圾信息
- Python项目维护经验_长期演进说明【指导】
- Win11如何卸载OneDrive_Win11卸载
- c++ std::future和std::prom
- Win11怎么关闭任务栏小组件_Windows11
- Win11怎么开启游戏模式_Windows11优化
- 如何使用正则表达式批量替换重复的 *- 模式为固定
- Win11输入法选字框不见了怎么办_Win11输入
- Python装饰器设计思路_功能增强机制说明【指导
- 如何使用Golang搭建Web开发环境_快速启动H
- c# Task.ConfigureAwait(tr
- Windows怎样关闭锁屏广告_Windows关闭
- Win11怎么设置默认输入法 Win11固定中文输
- php订单日志怎么导出excel_php导出订单日
- Win11怎么清理C盘系统错误报告_Win11清理
- PHP cURL GET请求:正确设置请求头与身份
- 如何在Golang中使用replace替换模块_指
- 如何解决同一段404代码在不同主机上表现不一致的问
- Python对象生命周期管理_创建销毁解析【教程】
- php485读数据时阻塞怎么办_php485非阻塞
- 如何用正则表达式精确匹配“start”到“end”
- php在Linux怎么部署_LNMP环境搭建PHP
- 如何将文本文件中的竖排字符串转换为横排字符串
- Python函数接口文档化_自动化说明【指导】
- Windows10怎么查看系统激活状态_Windo
- Win11怎么开启HDR模式_Windows 11
- PyTorch DDP 多进程训练在 Kaggle
- Win11 explorer.exe频繁崩溃_修复
- Win11怎么制作U盘启动盘_Win11原版系统安
- Win11怎么开启游戏工具栏_Windows11
- Win11摄像头无法使用怎么办_Win11相机隐私
- 如何在Golang中实现文件下载_Golang文件
- Win11怎么更改文件夹图标_自定义Win11文件
- C++如何获取CPU核心数?(std::threa
- Win11怎么设置应用分屏_Windows11贴靠
- php中$this和::能混用吗_对象与静态作用域
- Windows10系统服务优化指南_Win10禁用
- Windows10怎么用“讲述人”读屏辅助 Win
- php增删改查需要哪些扩展_开启mysqli或pd
- Windows10如何更改桌面背景_Win10个性
- Windows服务持续崩溃怎样修复_系统服务保护机
- GML (Geography Markup Lan
- Win10如何卸载预装Edge扩展_Win10卸载

QQ客服