Vector 向量中最常见的项-PARI/GP
我觉得我在这里真的很愚蠢,因为我本以为在Pari中已经有一个简单的命令,或者它应该是一个简单的东西来编写,但我根本无法理解这一点 给定一个向量,例如V,它将有重复的条目,如何确定最常见的条目是什么 例如,假设我们有: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]。所以无论
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
时错过了最后一行。求你了,现在把它修好。所以,现在我的例子很好用。