如何高效删除 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; ?>
】
相关推荐
- 如何在Golang中使用container/hea
- Mac系统更新下载慢或失败怎么办_解决macOS升
- Linux如何使用Curl发送请求_Linux下A
- php中$this和::能混用吗_对象与静态作用域
- Win11怎么查看显卡温度 Win11任务管理器查
- 零基础学会Python自动化办公_高效处理Exce
- php删除数据怎么加限制_带where条件删除避免
- Python 模块的 __name__ 属性如何由
- 如何用正则与预处理高效拦截带干扰符的恶意域名
- Win11怎么更改盘符_Win11磁盘管理修改驱动
- 如何处理“XML格式不正确”错误 常见XML we
- 如何高效删除 NumPy 二维数组中所有元素相同的
- Python对象生命周期管理_创建销毁解析【教程】
- Mac如何调整Dock栏大小和位置_Mac程序坞个
- Win11怎么设置应用分屏_Windows11贴靠
- VSC怎么在PHP中调试MySQL_数据库交互排查
- Win11怎么关闭右下角弹窗_Win11拦截系统通
- 如何在 IIS 上为 ASP.NET 6 应用排除
- Win11怎么查看局域网电脑_Windows 11
- Win11怎么关闭透明效果_Windows11个性
- win11 OneDrive怎么彻底关闭 Win1
- php删除数据怎么软删除_添加is_del字段标记
- Win11怎么修改DNS服务器 Win11设置DN
- C++如何编写函数模板?(泛型编程入门)
- 如何使用Golang配置安全开发环境_防止敏感信息
- Win11怎么关闭OneDrive同步_Win11
- 如何用正则表达式精确匹配最多含一个换行符的起止片段
- Drupal 中 HTML 链接被双重转义导致渲染
- php8.4匿名类怎么用_php8.4匿名类创建与
- Windows音频驱动无声音原因解析_声卡驱动错误
- 如何在Golang中处理数据库事务错误_回滚和日志
- 如何在Golang中实现RPC异步返回_Golan
- Win11怎么格式化U盘_Win11系统U盘格式化
- 微信JSAPI支付回调PHP怎么接收_处理JSAP
- Go 中的 := 运算符:类型推导机制与使用边界详
- Windows10如何删除Windows.old_
- VSC怎么配置PHP的Xdebug_远程调试设置步
- 如何在 Django 中修改用户密码后保持会话不丢
- Python类装饰器使用_元编程解析【教程】
- mac本地php环境如何开启curl_curl扩展
- Windows10电脑怎么设置虚拟光驱_Win10
- Python深度学习实战教程_神经网络模型构建与训
- Win11怎么设置指纹解锁 Win11笔记本录入指
- 如何使用Golang编写单元测试_创建Test函数
- 如何使用Golang实现微服务状态监控_Golan
- Windows10怎样连接蓝牙设备_Windows
- php增删改查需要哪些扩展_开启mysqli或pd
- 如何解决同一段404代码在不同主机上表现不一致的问
- 如何在 Python 中将 ISO 8601 时间
- Windows笔记本无法进入睡眠模式怎么办?(电源

QQ客服