You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用数组与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:00:08