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

gnuplot中zsort函数的异常行为及预期排序实现咨询

解决gnuplot zsort处理含NaN数据集的排序问题

问题原因

gnuplot的zsort函数在处理包含NaN的行时,遵循数值比较的核心规则:任何与NaN的比较结果都为假。当你指定多列排序(比如zsort(data,1,2)),即便第一列是唯一值,排序算法内部仍会检查后续列的比较逻辑,导致含NaN的行被默认放到所有非NaN行的末尾,而非严格按第一列数值顺序排列。
即便仅指定单列排序(zsort(data,1)),部分gnuplot版本仍会因为行中存在NaN改变排序优先级——zsort默认会把包含NaN的行视为“无效”行后置。

测试脚本复现

# 测试数据集:第一列为排序键,第二列含NaN
$DATA << EOD
3   10
1   NaN
2   20
4   NaN
EOD

# 原错误用法(产生异常输出)
set print $WRONG_SORTED
print zsort($DATA, 1, 2)
set print

# 正确排序方法
set print $CORRECT_SORTED
print sort($DATA, "real(column(1))")  # 用sort函数指定仅按第一列数值排序
set print

# 输出对比
print "=== 实际错误输出 ==="
plot $WRONG_SORTED using 1:2 with table
print "\n=== 预期正确输出 ==="
plot $CORRECT_SORTED using 1:2 with table

实现预期效果的两种方法

方法1:使用sort函数(推荐,gnuplot≥5.4)

sort函数支持自定义排序规则,可明确指定仅按第一列数值大小排序,完全忽略第二列的NaN影响:

$SORTED_DATA = sort($INPUT_DATA, "real(column(1))")

real(column(1))将第一列转为数值类型,确保按数值升序排列,所有行(包括含NaN的)都会严格遵循第一列的顺序。

方法2:强制zsort仅按第一列排序

若坚持使用zsort,需确保只传入第一列作为排序键,同时显式指定排序方向:

$SORTED_DATA = zsort($INPUT_DATA, 1, "+")

"+"表示升序,此时zsort会仅以第一列为排序依据,不再检查后续列的NaN状态。

验证结果

使用上述方法后,输出会严格按第一列升序排列,同时保留第二列原始值(包括NaN):

1   NaN
2   20
3   10
4   NaN

内容的提问来源于stack exchange,提问作者theozh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 14:40:07