如何高效删除 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; ?>
】
相关推荐
- php中::能访问全局变量吗_全局作用域与类作用域
- Windows10如何删除Windows.old_
- PHP中require语句后直接调用返回对象方法的
- Python解释执行模型_字节码流程说明【指导】
- mac怎么安装adb_MAC配置Android A
- Windows10如何更改系统字体大小_Win10
- php订单日志怎么记录评价_php记录订单评价日志
- 如何在 Go 中正确测试带 Cookie 的 HT
- 电脑无法识别U盘怎么办 Windows磁盘管理与驱
- XAMPP 启动失败(Apache 突然停止)的终
- php接口返回数据乱码怎么办_php接口调试编码问
- 如何使用正则表达式提取以编号开头、后接多个注解的逻
- 为什么Go建议使用error接口作为错误返回_Go
- Linux怎么设置磁盘配额_Linux系统Quot
- Win11怎么设置右键刷新选项_Windows11
- php订单日志怎么在swoole写_php协程sw
- Windows蓝屏错误0x00000023怎么修复
- Windows 11怎么更改锁屏超时时间_Wind
- Win11怎么关闭透明效果_Windows11个性
- 如何用正则与预处理结合精准拦截拼接式垃圾域名
- Win11怎么更改鼠标指针方案_Windows11
- Mac如何使用听写功能_Mac语音输入打字【效率技
- Win11玩游戏全屏闪退怎么办_Win11全屏优化
- Win10怎样卸载TeamViewer_Win10
- Win11蓝牙开关不见了怎么办_Win11蓝牙驱动
- Windows10无法识别USB设备描述符请求失败
- Win11怎么查看硬盘型号_Windows 11检
- c++ unordered_map怎么用 c++哈
- 如何在 Go 中判断变量是否为函数类型
- 如何使用 Selenium 正确获取篮球参考网站球
- Win11怎么设置屏保_Windows 11屏幕保
- Mac如何备份到iCloud_Mac桌面与文稿文件
- c++怎么使用std::unique实现去重_c+
- Python函数缓存机制_lru_cache解析【
- Win11怎么开启空间音效_Windows11耳机
- Mac如何开启夜览模式_Mac护眼模式设置与定时
- C++ static_cast和dynamic_c
- Windows10怎样设置家长控制_Windows
- Python对象比较与排序_魔术方法解析【教程】
- Golang如何测试HTTP中间件_Golang
- Python对象生命周期管理_创建销毁说明【指导】
- php查询数据怎么分组_groupby分组查询配合
- 如何使用Golang反射将map转换为struct
- c++怎么使用std::filesystem遍历文
- php嵌入式日志记录怎么实现_php将硬件数据写入
- VSC怎样在VSC中调试PHPAPI_接口调试技巧
- Win11怎么关闭搜索历史_Win11清除设备上的
- Win11怎么退出高对比度模式_Win11取消反色
- PHP主流架构如何处理会话管理_Session与C
- Windows音频驱动无声音原因解析_声卡驱动错误

QQ客服