三维numpy数组的逐像素位移CDF计算与绘制方法咨询
NumPy多维数组计算位移值CDF实现方案
前置依赖
- numpy用于数组计算
- matplotlib用于绘图
步骤1:截取目标区域数组
你需要的区域是行136162、列017的像素,直接用切片截取三个数组的对应部分即可:
import numpy as np import matplotlib.pyplot as plt # 定义目标区域切片,range左闭右开,和你给出的筛选范围完全一致 row_range = slice(136, 163) col_range = slice(0, 18) # 截取后displacement和weights维度为(27, 18, 15),mean_displacement维度为(27, 18) disp_crop = displacement_distribution[row_range, col_range] weight_crop = weights[row_range, col_range] mean_disp_crop = mean_displacement[row_range, col_range]
步骤2:过滤不符合条件的数值
按要求剔除位移小于0.1的数值,这里分两种场景,可根据你的实际需求选择:
场景A:剔除平均位移<0.1的整个像素
# 生成合法像素掩码,维度(27, 18) valid_pixel_mask = mean_disp_crop >= 0.1 # 提取所有合法像素的位移和权重,维度变为(合法像素数, 15) valid_disp = disp_crop[valid_pixel_mask] valid_weight = weight_crop[valid_pixel_mask] # 打平为一维数组用于整体CDF计算 all_valid_disp = valid_disp.flatten() all_valid_weight = valid_weight.flatten()
场景B:仅剔除单个<0.1的位移值,保留同一像素的其他合法位移
# 生成合法位移掩码,维度(27, 18, 15) valid_disp_mask = disp_crop >= 0.1 # 直接提取所有合法的位移和对应权重 all_valid_disp = disp_crop[valid_disp_mask] all_valid_weight = weight_crop[valid_disp_mask]
步骤3:计算CDF数值
# 按位移值从小到大排序 sort_index = np.argsort(all_valid_disp) sorted_disp = all_valid_disp[sort_index] sorted_weight = all_valid_weight[sort_index] # 计算累积权重,归一化后即为CDF值 cumulative_weight = np.cumsum(sorted_weight) cdf_value = cumulative_weight / cumulative_weight[-1] # 权重未归一化时保留此步,已归一化可删除
步骤4:绘制CDF图
plt.figure(figsize=(8, 6)) plt.plot(sorted_disp, cdf_value, linewidth=2) plt.xlabel('位移值', fontsize=12) plt.ylabel('累积概率 (CDF)', fontsize=12) plt.title('位移值累积分布函数', fontsize=14) plt.grid(alpha=0.3) plt.show()
你期望的效果图如下:
补充说明
- 如果需要绘制每个像素单独的CDF,遍历
valid_disp和valid_weight按步骤3的逻辑分别计算即可,可添加透明度参数alpha避免线条重叠看不清 - 若你的weights数组已经按像素做了归一化(每个像素的15个权重总和为1),计算CDF时可以跳过除以
cumulative_weight[-1]的步骤
内容的提问来源于stack exchange,提问作者zero
相关产品推荐
相关产品推荐

