【问题标题】:R: How to make the colon operator behave like in Python numpy for slicing "until the end"?R:如何使冒号运算符的行为类似于 Python numpy 中的“直到最后”切片?
【发布时间】:2017-12-14 02:08:35
【问题描述】:

在 Python numpy 中,您可以使用冒号运算符引用 array 的最后(例如 2 个)元素,而无需明确说明您正在“切片直到结束位置”,如下所示:

import numpy as np
arr = np.array(range(5))
arr[3:]

arr[-2:]

在 R 中,使用简单向量,您可以使用 tail 函数:

arr = 0:4
tail(arr, 2)

或者您可以使用冒号运算符对向量进行切片,但必须指定“结束位置”,如下所示:

arr[4:length(arr)]

有没有办法让 R 的冒号运算符的行为方式与 Python numpy 数组中的行为方式相同?以某种方式超载它。至少对于您希望arr[4:] 对最后两个位置 4 和 5 的向量进行切片的最后一种情况。

【问题讨论】:

  • 请注意,head 和 tail 也适用于矩阵: (mat

标签: r operator-overloading


【解决方案1】:

您不能使用arr[3:],因为解析器不允许。

你可以这样做(触发警告,那会很难看):

我们将重载'[' 并修改参数以将:Inf 替换为输入的相关维度。这不是一个通用的解决方案(尽管可以构建一个),它会减慢一切。

它也不能像嵌套括号一样工作,例如test_array[1:8[2:Inf]]

`[` <- function(a,...){ 
  ellipsis <- as.character(substitute(list(...)));
  if(length(ellipsis) == 2){
    base::'['(a, eval(parse(text=gsub(":Inf",paste0(":",length(a)),ellipsis[[2]]))))
              } else {
      base::'['(a, eval(parse(text=gsub(":Inf",paste0(":",nrow(a)),ellipsis[[2]]))),
                eval(parse(text=gsub(":Inf",paste0(":",ncol(a)),ellipsis[[3]]))))
  }
}

test_array <- 1:10
test_matrix <- matrix(1:16,ncol=4)

test_array[5:Inf]
# [1]  5  6  7  8  9 10

test_matrix[3:Inf,2:Inf]
#      [,1] [,2] [,3]
# [1,]    7   11   15
# [2,]    8   12   16

请注意,您也可以使用arr[-(1:3)] 代替arr[4:length(arr)]

【讨论】:

  • 不错。小心你的愿望,嗯?
  • 确实,也许我在帖子末尾添加的那一行对你来说更实用:)
猜你喜欢
  • 2022-01-22
  • 2021-02-07
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 2019-10-27
  • 2018-11-06
  • 1970-01-01
相关资源
最近更新 更多