Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.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
R 一种直观的方式来理解扫描和应用中的边距_R_Apply - Fatal编程技术网

R 一种直观的方式来理解扫描和应用中的边距

R 一种直观的方式来理解扫描和应用中的边距,r,apply,R,Apply,在sweep和apply中,边距似乎意味着两种不同的东西,对此我一直感到困惑。考虑: m <- matrix(1:6, ncol = 2) # The "- 1" operation is applied to all cells in each row sweep(m, MARGIN = 1, 1, "-") # The sum operation is applied to each column apply(m, MARGIN = 1, sum) mMARGIN参数在两个函数中的含

sweep
apply
中,边距似乎意味着两种不同的东西,对此我一直感到困惑。考虑:

m <- matrix(1:6, ncol = 2)
# The "- 1" operation is applied to all cells in each row
sweep(m, MARGIN = 1, 1, "-")
# The sum operation is applied to each column
apply(m, MARGIN = 1, sum)

mMARGIN参数在两个函数中的含义完全相同,即行操作。过去我曾多次被混淆为
sweep
,但我认为您被混淆为
apply

我正在打印下面的矩阵,以便以后可以方便地与
apply
sweep
进行视觉比较:

> m
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
首先,当边距为1时,
sweep
函数执行行操作。我将稍微修改第三个论点,使其更加明显:

> sweep(m, MARGIN = 1, 1:3, "-")
     [,1] [,2]
[1,]    0    3
[2,]    0    3
[3,]    0    3
在上述情况下,数字1从第1行中扣除,数字2从第2行中扣除,数字3从第3行中扣除。因此,很明显,这是一个按行操作

现在让我们看看下面的
apply
函数:

> apply(m, MARGIN = 1, sum)
[1] 5 7 9
显然,矩阵有3行2列。这很容易暗示这也是一个行操作,因为我们有3个结果,即与行数相同。如果我们检查这些数字,这一点也会得到确认。第1行和第5行、第2行和第7行以及第3行和第9行之和


因此,很明显,两种情况下的MARGIN都意味着行操作。

MARGIN参数在两个函数中的含义完全相同,即行操作。过去我曾多次被混淆为
sweep
,但我认为您被混淆为
apply

我正在打印下面的矩阵,以便以后可以方便地与
apply
sweep
进行视觉比较:

> m
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
首先,当边距为1时,
sweep
函数执行行操作。我将稍微修改第三个论点,使其更加明显:

> sweep(m, MARGIN = 1, 1:3, "-")
     [,1] [,2]
[1,]    0    3
[2,]    0    3
[3,]    0    3
在上述情况下,数字1从第1行中扣除,数字2从第2行中扣除,数字3从第3行中扣除。因此,很明显,这是一个按行操作

现在让我们看看下面的
apply
函数:

> apply(m, MARGIN = 1, sum)
[1] 5 7 9
显然,矩阵有3行2列。这很容易暗示这也是一个行操作,因为我们有3个结果,即与行数相同。如果我们检查这些数字,这一点也会得到确认。第1行和第5行、第2行和第7行以及第3行和第9行之和


所以,很明显,在这两种情况下,边距都意味着行操作。

我觉得我需要增加2美分。首先是我的记忆法:

我的记忆法: 我使用带有负边距的
apply()
(即
apply(A,边距=2,…)
变成-->
apply(A,边距=-1,…)
,这使得行为与扫描一致(就绝对值而言)&还具有使边距参数与numpy/torch/matlab轴参数一致的额外好处!!例如,
torch.mean(arr,axis=0)
=
np.mean(arr,axis=0)
=
应用(arr,MARGIN=-1,mean)
(当然,保留R的base-1索引)

这很容易记住,因为实际上不能将负边距与
扫描一起使用!因此,如果您忘记了哪个函数需要负边距,它将立即提示您一个错误

关于不一致性

我相信你是对的,OP,R核心团队确实在这里做了不一致的功能(就像他们经常做的那样)。简单的事实是
apply(A,MARGIN=1,…,FUN=f)
意味着:复制并应用FUN到A的每一行,&
sweep(A,MARGIN=1,…,FUN=f)
意味着:复制并应用FUN到A的每一列


虽然LyzandeR的助记符可能有用,但我相信他对行的定义过于模糊,并且微妙地改变了它在两个函数中的含义。

我觉得我需要加上我的2美分。首先是我的助记符:

我的记忆法: 我使用带有负边距的
apply()
(即
apply(A,边距=2,…)
变成-->
apply(A,边距=-1,…)
,这使得行为与扫描一致(就绝对值而言)&还具有使边距参数与numpy/torch/matlab轴参数一致的额外好处!!例如,
torch.mean(arr,axis=0)
=
np.mean(arr,axis=0)
=
应用(arr,MARGIN=-1,mean)
(当然,保留R的base-1索引)

这很容易记住,因为实际上不能将负边距与
扫描一起使用!因此,如果您忘记了哪个函数需要负边距,它将立即提示您一个错误

关于不一致性

我相信你是对的,OP,R核心团队确实在这里做了不一致的功能(就像他们经常做的那样)。简单的事实是
apply(A,MARGIN=1,…,FUN=f)
意味着:复制并应用FUN到A的每一行,&
sweep(A,MARGIN=1,…,FUN=f)
意味着:复制并应用FUN到A的每一列


虽然LyzandeR的助记符可能有用,但我相信他对行方式的定义太模糊了,并且微妙地改变了它在两个函数中的含义。

但是你不认为行方式这个术语有点模糊吗?例如,如果我是编程新手,我可能会认为在
apply(a,1,mean)的情况下
这意味着我们正在减少行数(例如numpy轴操作符)或跨行复制操作(在本例中为R)。但如果我们具体地说:关于横穿哪个轴
sweep()
&
apply()
复制它们各自的操作,那么OP确实是对的,它们是不一致的。但是你不认为术语行方向有点模糊吗?例如,如果我是编程新手,我可能会认为在
应用(a,1,mean)
的情况下,这意味着我们正在减少行(例如numpy轴操作符)或者跨行复制操作(在本例中为R)。但如果我们具体地说:关于跨哪个轴
sweep()
&
apply()
复制它们各自的操作,那么OP确实是对的,它们是不一致的。