当前位置: 首页 > news >正文

在指定条件下获取布尔矩阵中的索引矩阵

问题重新描述如下,设计程序
[[False False False True True True]
[ True False True False False True]
[False False False True True True]
[ True False False False False False]
[False False False False False False]
[ True False False False False False]
[ True True False True False False]
[False False False True False False]
[ True False True False False True]
[False False False True True True]
[ True True False True False False]
[ True False True False False True]
[ True True False True False False]]

使用 np.where查找前面布尔矩阵中,

1、如果1,4,6列有两个True,则给我返回1,4,6列值为True的行列索引,放在前两个位置(行对索引应一个矩阵,列索引对应一个矩阵),剩下的那一个没有True的则返回该元素原始索引,放在第三个位置。

2、2,3,5列中最多有一个True,返回它的行列索引,放在返回数组的第四个位置。如果1,4,6列中True的个数小于2,就返回 1,4,6列的原始行列索引(放在返回数组的1,2,3列),以及第二列的索引(放在返回数组的第4列)。

3、最终返回两个索引数组,一个是行索引数组,另一个是列索引数组,每一行的索引必须与布尔矩阵中的行相对应

defelegant_solution(arr):""" 修正的向量化版本,无循环 """n_rows=arr.shape[0]# 1. 行索引数组row_array=np.repeat(np.arange(n_rows)[:,None],4,axis=1)# 2. 预定义列cols_146=np.array([0,3,5])cols_235=np.array([1,2,4])# 3. 初始化列索引数组col_array=np.zeros((n_rows,4),dtype=int)# 4. 计算第1,4,6列True数量counts_146=arr[:,cols_146].sum(axis=1)# 5. 区分两种情况mask_eq2=counts_146==2mask_lt2=counts_146<2# 6. 处理mask_lt2为True的情况(True个数小于2)# 设置默认值:第1,4,6列和第2列col_array[mask_lt2]=np.array([0,3,5,1])# 7. 处理mask_eq2为True的情况(True个数等于2)ifnp.any(mask_eq2):rows_eq2=np.where(mask_eq2)[0]n_eq2=len(rows_eq2)ifn_eq2>0:# 提取这些行的第1,4,6列arr_146_sub=arr[rows_eq2][:,cols_146]# 方法:使用argsort分离True和False# 对每行进行排序,True(1)会排在False(0)后面sorted_indices=np.argsort(arr_146_sub,axis=1)# 默认升序,False在前# 提取True的位置(最后两个)和False的位置(第一个)true_indices=sorted_indices[:,-2:]# 形状: (n_eq2, 2)false_indices=sorted_indices[:,0:1]# 形状: (n_eq2, 1)# 转换为原始列索引true_cols=cols_146[true_indices]false_cols=cols_146[false_indices]# 填充前三个位置col_array[rows_eq2,0]=true_cols[:,0]col_array[rows_eq2,1]=true_cols[:,1]col_array[rows_eq2,2]=false_cols[:,0]# 处理第2,3,5列arr_235_sub=arr[rows_eq2][:,cols_235]# 找到每行第一个True的位置# 使用cumsum找到第一个Truecumsum_arr=np.cumsum(arr_235_sub,axis=1)first_true_mask=(cumsum_arr==1)&arr_235_sub# 获取列索引# argmax会返回第一个最大值的位置,我们确保每行至多一个Truefirst_true_idx=np.argmax(first_true_mask,axis=1)# 检查是否找到Truehas_true=np.any(first_true_mask,axis=1)# 转换并填充# 注意:当没有True时,argmax返回0,但我们需要-1# 所以使用where根据has_true选择值col_235_vals=np.where(has_true,cols_235[first_true_idx],-1)col_array[rows_eq2,3]=col_235_valsreturnrow_array,col_array
http://www.gsyq.cn/news/189686.html

相关文章:

  • 系统学习minidump调试链:符号文件配置与路径设置
  • python赋值与复制
  • 从零实现工业传感器接口元件库——Altium Designer完整示例
  • 简单易行地提高你的回归模型信任度
  • YOLOv8自动标注功能实现可能性探讨
  • 深入理解线性与非线性的支持向量机(SVMs)
  • 使用 Rerankers 提高 RAG 性能
  • YOLOv8能否检测道路积水?智慧城市防汛系统
  • YOLOv8能否检测海冰减少?北极航运路线变化
  • YOLOv8能否检测干旱区域?农业灌溉决策支持
  • MASt3R-SfM:离线重建 匹配和关键帧筛选 - MKT
  • 掌握VHDL课程设计大作业:Vivado平台图解说明
  • KiCad入门必看:零基础快速理解电路设计流程
  • 前后端分离校园食堂订餐系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • YOLOv8能否用于文化遗产保护?壁画破损识别
  • YOLOv8能否用于古村落布局分析?风水格局研究
  • 国产操作系统知识点总结
  • YOLOv8能否检测北极熊栖息地?气候变化影响评估
  • YOLOv8镜像内置哪些依赖?PyTorch安装细节揭秘
  • ALU在工业控制中的应用:系统学习指南
  • YOLOv8音乐演出灯光控制:演员位置识别触发光效变化
  • YOLOv8室内装修设计:家具布局识别与风格匹配建议
  • CSS vh单位在响应式轮播图中的应用技巧
  • YOLOv8模型导出ONNX格式教程:跨平台部署第一步
  • YOLOv8能否用于安防监控?夜间红外图像测试
  • YOLOv8官方文档中文版上线:https://docs.ultralytics.com/zh/
  • GitHub Star破万!YOLOv8为何成为最火计算机视觉项目?
  • 软银集团完成对OpenAI 400亿美元投资承诺
  • YOLOv8能否检测建筑裂缝?土木工程监测应用
  • YOLOv8建筑工地监控:安全帽佩戴检测与危险行为识别