2017-08-29 69 views
-1

我有一个numpy阵列arr = np.arange(20).reshape(2,10)。我想定义一个切片sli = slice(start,stop, step),然后再访问arr[0,sli]。我如何定义sli,使得arr[0,sli]是整个数组?即sli=:返回带切片功能的整个阵列

我已经试过:

sli = slice(0,-1) # equivalent to arr[0,:-1] 
sli = slice(0,0) # equivalent to [] 
sli = slice(0) # equivalent to [] 
sli = slice(0,10) # works fine, but i might not know the shape of arr 
        # at the time I define sli 
+2

你试过'片(无)'? –

+0

@JonClements这工作,谢谢。但是,有没有一个原因让你评论而不是回答? –

+0

@cᴏʟᴅsᴘᴇᴇᴅ我知道如何访问整个数组的许多方法,但我想要一个允许使用变量访问整个数组的方法,我的程序依赖于预定义的变量ant,然后调用arr [0,sli]' –

回答

2

使用Ellipsis符号:

import numpy as np 

arr = np.arange(20).reshape(2,10) 
sli = ... 
out = arr[0, sli] 

print(out)  
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 

作品上python3.x。对于旧版本,您应该使用slice(None)

+0

有趣的是,为什么使用“Ellipisis”工作,你为什么要使用它?我记得省略片的参数会产生相同的CPython字节码来使用'None',所以这看起来像是明显的Pythonic选择? –

+1

@Chris_Rands在None时要小心,因为它会在某些情况下增加尺寸。 –

+0

谢谢,你能举一个小例子吗? –

1

通过JonClements的评论

sli = slice(None) 
arr[0,sli] 
# array([0,1,2,3,4,5,6,7,8,9]) 
+0

这不会返回整个数组?只有第一行。那是你要的吗? –

+0

@cᴏʟᴅsᴘᴇᴇᴅ我想要一个变量'sli',s.t. 'arr [0,sli]'相当于'arr [0,:]',分别相当于'arr [0]'。所以这工作得很好,除非有一些隐藏。 –

+0

'sli = ...; arr [0,sli]'是我的家伙。 –