bitwise_and结果DataFrame无法打印及仅显示>1值的解决方法
问题解决指南
1. 修复DataFrame无法打印的问题
你的DataFrame无法正常打印,核心原因是扁平化后的图像特征列数过多(400×600×3=720000列),Pandas默认会截断大尺寸DataFrame的显示。你之前仅修改了NumPy的打印选项,但需要同时配置Pandas的显示参数:
添加以下代码到创建DataFrame之后:
import pandas as pd # 配置Pandas显示所有列/行(按需调整) pd.set_option('display.max_columns', None) pd.set_option('display.max_rows', None) # 避免单元格内容截断 pd.set_option('display.max_colwidth', None)
如果不需要显示全部72万列,可以设置仅显示部分列,比如:
# 仅显示前10列和最后1列(Target) print(df.iloc[:, list(range(10)) + [-1]])
2. 仅打印DataFrame中值大于1的部分
由于bitwise_and运算后非椭圆区域像素值为0,你可以通过以下方式筛选出值大于1的部分:
方法1:保留DataFrame结构,替换无效值为NaN
# 复制原DataFrame,避免修改原始数据 filtered_df = df.copy() # 仅处理数值列(排除最后一列Target) numeric_cols = filtered_df.columns[:-1] filtered_df[numeric_cols] = filtered_df[numeric_cols].where(filtered_df[numeric_cols] > 1) print(filtered_df)
方法2:提取所有有效数值的单元格信息
如果需要只查看有有效数值(>1)的单元格位置和内容:
# 筛选出所有值>1的单元格,返回带索引的Series non_zero_values = df[df > 1].stack() print(non_zero_values)
方法3:保留至少有一个有效数值的行
如果只需要保留包含有效像素的记录:
# 筛选出至少有一个像素值>1的行 valid_rows = df[df.iloc[:, :-1].gt(1).any(axis=1)] print(valid_rows)
优化后的完整代码片段
import os import cv2 import numpy as np import pandas as pd import sys flat_data_arr=[] target_arr=[] Type_of_Risk = ["低风险", "中风险", "高风险", "极高风险"] # 替换为你的实际风险类型列表 datadir = r'C:\Users\HRMini\MyProjects\PalmPredicion\Male\' for i in Type_of_Risk: print(f'loading... Type_of_Risk : {i}') path=os.path.join(datadir,i) for img in os.listdir(path): img1 = np.zeros((400,600,3), np.uint8) img1 = cv2.ellipse(img1, (280, 190), (290, 60),160, 0, 360, (255, 255, 255), -1) img2 = cv2.imread(os.path.join(path,img)) bitAnd = cv2.bitwise_and(img2, img1) # 可选:注释掉显示窗口以加快批量处理速度 # cv2.imshow("img1", img1) # cv2.imshow("img2", img2) # cv2.imshow('bitAnd', bitAnd) # cv2.waitKey(1) # cv2.destroyAllWindows() flat_data_arr.append(bitAnd.flatten()) target_arr.append(Type_of_Risk.index(i)) print(f'loaded Type_of_Risk:{i} successfully') flat_data=np.array(flat_data_arr) target=np.array(target_arr) # 配置Pandas显示选项,避免刷屏 pd.set_option('display.max_columns', 20) pd.set_option('display.max_rows', 10) df=pd.DataFrame(flat_data) df['Target']=target # 打印截断后的完整DataFrame print("完整DataFrame(截断显示):") print(df) # 打印值大于1的筛选结果 print("\n值大于1的筛选结果:") filtered_df = df.copy() numeric_cols = filtered_df.columns[:-1] filtered_df[numeric_cols] = filtered_df[numeric_cols].where(filtered_df[numeric_cols] > 1) print(filtered_df)
内容的提问来源于stack exchange,提问作者Anura Thilak Bandara
相关产品推荐
相关产品推荐

