2017-07-10 34 views
1

在Python numpy,你可以参考过去的(比如2)使用冒号运算符,但没有明确说明你的array的元素是“分片,直到最后的位置”,像这样:R:如何使得冒号运算符像在Python numpy中一样进行切片“直到结束”?

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分割矢量。

+0

注意,头部和尾部工作矩阵,以及:(垫< - 基质(1:20,nrow = 4));头(垫,2); 尾巴(垫子,2) –

回答

2

您不能使用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)]

+0

不错。小心你想要什么,呃? –

+1

事实上,也许我在帖子末尾添加的那一行对你来说会更实用:) –

+0

我昨天读过'data.table'库解析表达式来检测':='(so':= '不用作适当的操作符,而只是一组不会触发解析器并允许后续代码运行的字符。 'data.table'被称为非常快,所以实际上,这种破解可能是有效的。 –

相关问题