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确实是对的,它们是不一致的。