【问题标题】:Handling crossproduct in R (vs. Python)在 R 中处理叉积(与 Python 相比)
【发布时间】:2018-11-21 21:02:38
【问题描述】:

在尝试对该区域应用鞋带公式时,我在RPython 的处理方式上发现了一个有趣的差异。在Python 中,可以直接使用nympy 功能:

import numpy as np
import pandas as pd
d = {"A": [2, 3, 1, 2], "B": [4, -8, 2, 4]}
df = pd.DataFrame(data=d)
area = 0.5 * np.abs(np.dot(df[df.columns[0]], np.roll(df[df.columns[1]], 1)) -
    np.dot(df[df.columns[1]], np.roll(df[df.columns[0]], 1)))
area

7.0

但是,我没有在 R 中使用 crossprod (%*%) 函数做同样的事情,但只有这样的基本迭代:

get_area <- function(x, y) {
    add.val <- sub.val <- NA
    for(i in 1:(length(x) - 1)) {
        add.val[i] <- 0.5 * x[i] * (y[i + 1])
        sub.val[i] <- 0.5 * y[i] * (x[i + 1])
    }
    return(abs(sum(add.val) - sum(sub.val)))
}

R 有没有更高效的东西?

【问题讨论】:

    标签: python r area


    【解决方案1】:

    如果我们只定义一些辅助函数,它可以在 R 中非常简单。例如

    shift_left <- function(x)c(x[-1],x[1])
    shift_right <- function(x)c(x[length(x)],x[-length(x)])
    
    a <- c(2, 3, 1, 2)
    b <- c(4, -8, 2, 4)
    1/2 * abs(sum(a * (shift_left(b) - shift_right(b))))
    # [1] 7
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-21
      • 2021-11-24
      • 2010-09-15
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 2015-06-13
      相关资源
      最近更新 更多