使用数组与Count函数实现多列数据分箱计数的问题求助
Fortran分箱计数优化解决方案
首先,你之前误用数组切片(lower(i:)、upper(:i))是核心问题——每个分箱的上下限是单个标量值,直接取数组的第i个元素lower(i)、upper(i)即可,不需要切片操作。以下是修正后的完整实现:
步骤1:正确定义分箱上下限数组
分箱范围-3到3,共20个分箱,每个宽度0.3,我们可以用循环或数组构造器直接生成lower和upper数组:
integer, parameter :: NBINS = 20 real, parameter :: MIN_VAL = -3.0, MAX_VAL = 3.0 real, parameter :: BIN_WIDTH = (MAX_VAL - MIN_VAL)/NBINS ! 计算得0.3,与需求一致 real :: lower(NBINS), upper(NBINS) integer :: i ! 生成分箱上下限 do i = 1, NBINS lower(i) = MIN_VAL + (i-1)*BIN_WIDTH upper(i) = MIN_VAL + i*BIN_WIDTH end do ! 也可以用数组构造器一行生成: ! lower = [(MIN_VAL + (i-1)*BIN_WIDTH, i=1, NBINS)] ! upper = [(MIN_VAL + i*BIN_WIDTH, i=1, NBINS)]
步骤2:初始化计数数组并完成分箱统计
先初始化四个计数数组为0,然后通过循环遍历每个分箱,用count函数统计对应列的数值落在当前分箱的数量:
! 假设b、c、d、e是已定义的一维实数数组,存储待统计数据 real :: b(:), c(:), d(:), e(:) integer :: binb(NBINS), binc(NBINS), bind(NBINS), bine(NBINS) ! 初始化计数数组为0 binb = 0 binc = 0 bind = 0 bine = 0 ! 循环统计每个分箱 do i = 1, NBINS binb(i) = count(b >= lower(i) .and. b < upper(i)) binc(i) = count(c >= lower(i) .and. c < upper(i)) bind(i) = count(d >= lower(i) .and. d < upper(i)) bine(i) = count(e >= lower(i) .and. e < upper(i)) end do
错误原因说明
你之前用lower(i:)和upper(:i)会传递一个数组切片给count的条件判断,这会导致数组维度不匹配(b是一维数组,切片也是一维,条件判断会变成逐元素的逻辑数组,count会统计所有满足条件的元素总数,但这不是单个分箱的统计逻辑)。正确的做法是取单个标量lower(i)和upper(i),让b >= lower(i)生成一个逻辑数组,标记b中每个元素是否大于等于当前分箱下限,再结合b < upper(i)的逻辑数组,用.and.合并后,count就能统计出当前分箱内的元素数量。
内容的提问来源于stack exchange,提问作者Garrett Leigh
相关产品推荐
相关产品推荐

