Vector 向量中最常见的项-PARI/GP

Vector 向量中最常见的项-PARI/GP,vector,pari,pari-gp,Vector,Pari,Pari Gp,我觉得我在这里真的很愚蠢,因为我本以为在Pari中已经有一个简单的命令,或者它应该是一个简单的东西来编写,但我根本无法理解这一点 给定一个向量,例如V,它将有重复的条目,如何确定最常见的条目是什么 例如,假设我们有: V=[0,1,2,2,3,4,6,8,8,8] 我想要返回值8的东西 我知道像vecsearch这样的事情,但我不知道如何调整它来实现这一点 与此密切相关的是,我希望这个结果返回最常见的非零项,我看到的一些向量将0作为最常见的项。例如:V=[0,0,0,0,3,3,5]。所以无论

我觉得我在这里真的很愚蠢,因为我本以为在Pari中已经有一个简单的命令,或者它应该是一个简单的东西来编写,但我根本无法理解这一点

给定一个向量,例如V,它将有重复的条目,如何确定最常见的条目是什么

例如,假设我们有:
V=[0,1,2,2,3,4,6,8,8,8]

我想要返回值8的东西

我知道像
vecsearch
这样的事情,但我不知道如何调整它来实现这一点


与此密切相关的是,我希望这个结果返回最常见的非零项,我看到的一些向量将0作为最常见的项。例如:
V=[0,0,0,0,3,3,5]
。所以无论我在这里执行什么,我都要返回3。 我试着写些东西,去掉所有的零项,但还是很挣扎

我特别尝试过的是:

rem( v ) = {
my( c );
while( c = vecsearch( v, 0 ); #c, v = vecextract( v, "^c" ) ); v
}

但是
vecextract
似乎不喜欢这种设置。

如果您可以确保所有元素都在某个固定范围内,那么仅使用PARI/GP代码进行计数排序就足够了,如下所示:

counts_for(v: t_VEC, lower: t_INT, upper: t_INT) = {
    my(counts = vector(1+upper-lower));

    for(i=1, #v, counts[1+v[i]-lower]++);
    vector(#counts, i, [i-1, counts[i]])
};

V1 = [0, 1, 2, 2, 3, 4, 6, 8, 8, 8];
vecsort(counts_for(V1, 0, 8), [2], 4)[1][1]
> 8

V2 = [0, 0, 0, 0, 3, 3, 5];
vecsort(counts_for(V2, 0, 5), [2], 4)[1][1]
> 0
为了方便起见,您还可以实现以下快捷方式:

counts_for1(v: t_VEC) = {
    counts_for(v, vecmin(v), vecmax(v))
};

most_frequent(v: t_VEC) = {
    my(counts=counts_for1(v));
    vecsort(counts, [2], 4)[1][1]
};

most_frequent(V1)
> 8

most_frequent(V2)
> 0

如果您可以确保所有元素都在某个固定范围内,那么仅使用PARI/GP代码进行计数排序就足够了,如下所示:

counts_for(v: t_VEC, lower: t_INT, upper: t_INT) = {
    my(counts = vector(1+upper-lower));

    for(i=1, #v, counts[1+v[i]-lower]++);
    vector(#counts, i, [i-1, counts[i]])
};

V1 = [0, 1, 2, 2, 3, 4, 6, 8, 8, 8];
vecsort(counts_for(V1, 0, 8), [2], 4)[1][1]
> 8

V2 = [0, 0, 0, 0, 3, 3, 5];
vecsort(counts_for(V2, 0, 5), [2], 4)[1][1]
> 0
为了方便起见,您还可以实现以下快捷方式:

counts_for1(v: t_VEC) = {
    counts_for(v, vecmin(v), vecmax(v))
};

most_frequent(v: t_VEC) = {
    my(counts=counts_for1(v));
    vecsort(counts, [2], 4)[1][1]
};

most_frequent(V1)
> 8

most_frequent(V2)
> 0

谢谢你的回复!不过我有点困惑;当运行
vecort(counts_for(V1,0,8),[2],4][1][code>时,我得到了以下错误:
vecort:lexicalographic vecort(t_INT)中的输入错误。
当运行
counts_for
时,我似乎只得到了一个整数向量,但我想根据设置得到一些不同的东西?例如:
counts\u for(V1,0,8)=[1,1,2,1,1,0,1,0,3]
知道为什么会这样吗?对不起,我在键入函数
counts\u for
时错过了最后一行。求你了,现在把它修好。所以,现在我的例子运行良好。感谢您的回复!不过我有点困惑;当运行
vecort(counts_for(V1,0,8),[2],4][1][code>时,我得到了以下错误:
vecort:lexicalographic vecort(t_INT)中的输入错误。
当运行
counts_for
时,我似乎只得到了一个整数向量,但我想根据设置得到一些不同的东西?例如:
counts\u for(V1,0,8)=[1,1,2,1,1,0,1,0,3]
知道为什么会这样吗?对不起,我在键入函数
counts\u for
时错过了最后一行。求你了,现在把它修好。所以,现在我的例子很好用。