Python3如何统计角度列表中折叠度小于45度的元素数量?
实现方案
首先明确核心注意点:np.arccos返回的计算结果为弧度单位,45°对应的弧度值为np.pi/4,不可直接用数值45和angolo做大小对比。
你的原代码未存储所有元素的角度值,仅保留了最后一次循环的单个角度值,因此无法直接统计符合条件的元素总数,只需做少量修改即可实现需求:
完整修改后代码
import sys,os import numpy as np fn='listadir.txt' # <=== lista_dir with open(fn,'r') as f: lines=f.readlines() # 存储所有文件夹下符合条件的元素总数、总元素数,用于算全局平均 total_valid = 0 total_elements = 0 for l in lines: os.chdir('C:\\Users\\simone\\anaconda3\\Ex_Files_Python_Statistics_EssT\\' + l.strip('\n')) os.system('dir /b cnf-* > listacnf.txt') with open('listacnf.txt','r') as f: linescnf=f.readlines() Q=np.matrix([[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]]) cc = 1 # 新增:存储当前文件夹下所有元素的角度 current_angles = [] for ll in linescnf: with open(ll.strip('\n')) as ff: cnft=ff.readlines() cnf=cnft[1:] for lc in cnf: lv = lc.strip('\n').split() ux = float(lv[3]) uy = float(lv[4]) uz = float(lv[5]) Qxx = ux*ux Qxy = ux*uy Qxz = ux*uz Qyx = uy*ux Qyy = uy*uy Qyz = uy*uz Qzx = uz*ux Qzy = uz*uy Qzz = uz*uz Q += np.matrix([[Qxx, Qxy, Qxz],[Qyx, Qyy, Qyz],[Qzx,Qzy, Qzz]]) cc += 1 angolo = np.arccos(ux*uy*uz) # 新增:把当前角度存入列表 current_angles.append(angolo) Q = Q/cc os.chdir('..') # 统计当前文件夹下小于45度的元素数量 threshold = np.pi / 4 # 45度转弧度 current_arr = np.array(current_angles) current_valid = np.sum(current_arr < threshold) current_avg = current_valid / len(current_arr) # 单文件夹平均占比/数量 # 累加到全局统计 total_valid += current_valid total_elements += len(current_arr) print(f"当前文件夹{l.strip()}:小于45度的元素共{current_valid}个,占比{current_avg:.2%}") # 全局统计 global_avg_count = total_valid / len(lines) # 每个文件夹平均符合数量 global_avg_ratio = total_valid / total_elements # 全局符合占比 print(f"全局统计:所有文件夹平均每个含{global_avg_count:.2f}个小于45度的元素,整体占比{global_avg_ratio:.2%}")
核心统计逻辑说明
- 用
np.array(角度列表) < 阈值生成布尔数组,符合条件的位置为True(对应数值1),不符合为False(对应数值0) - 直接对布尔数组调用
np.sum()即可得到符合条件的元素总数,无需额外循环判断。
内容的提问来源于stack exchange,提问作者Zikan
相关产品推荐
相关产品推荐

