2015-10-18 11 views
2

对于2*N x 2*N阵列x,我想交换以特定的方式与行[N:2*N][0:N],即我有问题是,如果有“添加/接合”切片对象的“内置”的方式为了达成这个?即例如:Numpy:如何添加/连接切片对象?

x[N:2*N + 0:N,:] 

虽然,前面做了一些不同的事情。

当然,我可以做的事情,如vstack((x[N:2*N,:],x[0:N,:])),这不是我真正想要的,或x[[i for i in range(N)]+[i for i in range(N,2*N)],:],这可能是缓慢的。

+1

您应该添加一个例子输入和预期的输出。 –

回答

1

我认为你正在寻找numpy.r_,其中“转化切片对象沿第一轴串联”。它可以让你执行沿着第一轴更复杂的切片 - 你可以连接多个片,用逗号:np.r_[5:10, 100:200:10, 15, 20, 0:5]

例如:

>>> import numpy as np 
>>> N = 2 
>>> x = np.arange(16).reshape(4, 4) 
>>> x[np.r_[N:2*N, 0:N]] 
array([[ 8, 9, 10, 11], 
     [12, 13, 14, 15], 
     [ 0, 1, 2, 3], 
     [ 4, 5, 6, 7]]) 

而且在这种特殊情况下,你也可以只np.roll它:

>>> np.roll(x, N, axis=0) 
array([[ 8, 9, 10, 11], 
     [12, 13, 14, 15], 
     [ 0, 1, 2, 3], 
     [ 4, 5, 6, 7]]) 
+0

谢谢。我想'R_ [N:2 * N,0:N]'是某种方式相同'[I为i的范围(N)] + [I为i的范围(N,2 * N)]'(我在我的问题被提已经),或'范围(N,2 * N)+范围(N)',或任何类似,它串接索引范围'N:2 * N'和'0:N'成一个单一的范围。所以还有待观察哪个是最快的。最后,roll()与速度的实际索引相媲美吗? – Mark

+0

随着你必须从某个地方连接多个切片,或者索引之前或之后。没有神奇的编译多片符号。 'roll'使用相同的方法。 – hpaulj

+0

@马克如果你是演出结束后,它似乎像'roll'和'vstack'比使用索引范围(这是有道理的)快得多。 – grc