首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jq中的向量数学算术运算

jq中的向量数学算术运算
EN

Stack Overflow用户
提问于 2019-09-13 15:17:07
回答 2查看 370关注 0票数 1

我想在存储数字的json数组上执行向量数学运算。简而言之,我们如何使用jq实现一对一的算术运算?

我尝试了一些'map‘过滤器,但是不能达到我期望的效果。

代码语言:javascript
复制
jq 'map(one-to-one)' <<< "{\"a\":[1,2], \"b\":[3,4]}"

代码语言:javascript
复制
jq 'map(one-to-one)' <<< "[[1,2],[3,4]]"

应该产生

代码语言:javascript
复制
[3,8]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-13 17:07:17

对于这种类型的问题,定义一个泛型函数是有意义的:

代码语言:javascript
复制
# Input is assumed to be an array of two numeric arrays of the same length
def pairwise: transpose | map(.[0] * .[1]);

我们现在可以通过各种方式轻松地使用它:

代码语言:javascript
复制
[[1,2],[3,4]] | pairwise

{"a":[1,2], "b":[3,4]} | [.a,.b] | pairwise

{"a":[1,2], "b":[3,4]} | [.[]] | pairwise

当然,这些情况下的结果都是[3,8]

效率

对于非常大的输入,可能值得避免使用transpose

代码语言:javascript
复制
def pairwise:
   .[0] as $x | .[1] as $y 
   | reduce range(0; $x|length) as $i ([]; . + [$x[$i] * $y[$i]]);

通常,对于向量,人们对内积感兴趣,为了提高效率,最好直接定义内积,例如:

代码语言:javascript
复制
def inner($a; $b):
  reduce range(0;$a|length) as $i (0; . + $a[$i]*$b[$i]);
票数 1
EN

Stack Overflow用户

发布于 2019-09-13 15:28:18

代码语言:javascript
复制
jq '. | transpose | map(reduce .[] as $item (1; . * $item))' <<< "[[1,2],[3,4]]"

Transpose为我们提供了需要相乘的元素:[[1, 3], [2, 4]]。然后,我们可以使用reduce将每个子数组映射到其乘积。

对象版本只是稍有不同,因为我们需要从属性中获取这些值:

代码语言:javascript
复制
jq '[.[]] | transpose | map(reduce .[] as $item (1; . * $item))' <<< "{\"a\":[1,2], \"b\":[3,4]}"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57918971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档