2016-09-20 164 views
3

编程切片我可以使用numpy.mgrid如下:NumPy的创建索引/从阵列

a = numpy.mgrid[x0:x1, y0:y1] # 2 dimensional 
b = numpy.mgrid[x0:x1, y0:y1, z0:z1] # 3 dimensional 

现在,我想以编程方式创建括号内的表达,因为我不知道我是否有1,2 ,3个或更多维度。我正在寻找类似的东西:

shape = np.array([[x0, x1], [y0, y1], ... maybe more dimensions ...]) 
idx = (s[0]:s[1] for s in shape) 
a = numpy.mgrid[idx] 

这给了第二行至少一个语法错误。 如何正确生成这些索引/切片编程?(这里的mgrid是一个示例/用例,这个问题实际上是关于索引的一般问题。)

+0

用'idx = [range(s [0],s [1])为s形成]'然后使用'meshgrid':'np.meshgrid(* idx)'? – Divakar

回答

5

使用slice object。例如:

shape = np.array([[0, 10], [0, 10]]) 
idx = tuple(slice(s[0],s[1], 1) for s in shape) 
#yields the following 
#(slice(0, 10, 1), slice(0, 10, 1)) 
np.mgrid[idx] 

产生

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

     [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]]) 

或者,可以使用numpy的速记np.s_,例如np.s_[0:10:1],而不是slice(1, 10, 1),但它们是等效的对象。

+1

'slice(s [0],s [1],None)'是意图更好的翻译 – Eric

+1

或甚至更好的slice(s [0],s [1])'。我认为明确比隐含解释更好。 – wflynny

+2

或者解包,'[切片(s,e)s,e形状]' – hpaulj