Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Postgresql能否访问步长为的数组切片,即返回下采样数组?_Arrays_Postgresql_Slice - Fatal编程技术网

Arrays Postgresql能否访问步长为的数组切片,即返回下采样数组?

Arrays Postgresql能否访问步长为的数组切片,即返回下采样数组?,arrays,postgresql,slice,Arrays,Postgresql,Slice,我已经搜索了所有的Postgresql数组文档并通读了一遍。也许这在博士后中得到了支持。我可以得到如下所示的numpy阵列的下采样版本: numpy.数组([1,2,3,4,5,6,7,8,9,0])[0:9:2]#这里的2是切片的步长 输出:数组([1,3,5,7,9]) 可以对postgresql数组执行类似的操作吗 选择(数组[1,2,3,4,5,6,7,8,9,10])[1:10:2];//不要忘记基于1的索引 上述方法不起作用。我希望在具有固定大小元素的数组中,此操作可以非常快。不,p

我已经搜索了所有的Postgresql数组文档并通读了一遍。也许这在博士后中得到了支持。我可以得到如下所示的numpy阵列的下采样版本:

numpy.数组([1,2,3,4,5,6,7,8,9,0])[0:9:2]#这里的2是切片的步长
输出:数组([1,3,5,7,9])

可以对postgresql数组执行类似的操作吗

选择(数组[1,2,3,4,5,6,7,8,9,10])[1:10:2];//不要忘记基于1的索引


上述方法不起作用。我希望在具有固定大小元素的数组中,此操作可以非常快。

不,postgres不支持python中用于跳过数组元素的语法。您必须取消对它的测试,将它拆分为行,然后再次聚合它。结合使用WITH ORDINALITY和unnest可以获得数组中每个元素的索引

SELECT array_agg(x order by n) 
FROM unnest(ARRAY[1,2,3,4,5,6,7,8,9,10]) with ordinality as o(x, n) 
WHERE (n-1) % 2 = 0;
  array_agg
-------------
 {1,3,5,7,9}
每三个元素可以使用(n-1)%3,以此类推

您甚至可以创建一个简单的函数:

CREATE OR REPLACE FUNCTION array_step(p_array anyarray, p_step int) 
RETURNS anyarray AS $$
    SELECT array_agg(x order by n) FROM unnest(p_array) WITH ORDINALITY AS o(x, n) WHERE (n-1) % p_step = 0;
$$
LANGUAGE SQL
IMMUTABLE
PARALLEL SAFE;

select array_step(ARRAY[1,2,3,4,5,6,7,8,9,10], 3);
 array_step
------------
 {1,4,7,10}

select array_step((ARRAY[1,2,3,4,5,6,7,8,9,10])[2:8], 3);
 array_step
------------
 {2,5,8}

不,postgres不支持python中用于跳过数组元素的语法。您必须取消对它的测试,将它拆分为行,然后再次聚合它。结合使用WITH ORDINALITY和unnest可以获得数组中每个元素的索引

SELECT array_agg(x order by n) 
FROM unnest(ARRAY[1,2,3,4,5,6,7,8,9,10]) with ordinality as o(x, n) 
WHERE (n-1) % 2 = 0;
  array_agg
-------------
 {1,3,5,7,9}
每三个元素可以使用(n-1)%3,以此类推

您甚至可以创建一个简单的函数:

CREATE OR REPLACE FUNCTION array_step(p_array anyarray, p_step int) 
RETURNS anyarray AS $$
    SELECT array_agg(x order by n) FROM unnest(p_array) WITH ORDINALITY AS o(x, n) WHERE (n-1) % p_step = 0;
$$
LANGUAGE SQL
IMMUTABLE
PARALLEL SAFE;

select array_step(ARRAY[1,2,3,4,5,6,7,8,9,10], 3);
 array_step
------------
 {1,4,7,10}

select array_step((ARRAY[1,2,3,4,5,6,7,8,9,10])[2:8], 3);
 array_step
------------
 {2,5,8}

谢谢-非常好的解决方案。这似乎可以很好地工作,虽然有点不太方便,我希望。我试试看。看起来它可能需要检查每一个普通值,而不是跳过一个已知的步长来获得一个我希望的降采样,但可能它有一些我没有预料到的“隐藏”优化。我显然不是博士后工作原理的专家。谢谢-非常好的解决方案。这似乎可以很好地工作,虽然有点不太方便,我希望。我试试看。看起来它可能需要检查每一个普通值,而不是跳过一个已知的步长来获得一个我希望的降采样,但可能它有一些我没有预料到的“隐藏”优化。我显然不是博士后工作原理的专家。