2012-05-03 112 views
1

我想切片下面的数组获取第2和第3行,除第2列和最后一列之间的列以外的第一列,但是我尝试过的每个切片似乎都不起作用。例如,下面的第一个打印语句由于在括号中提供了语法错误。我也试图简单地连接数组,但我不认为这是完成这个问题的最有效的方法。Numpy高级切片

import numpy as np 
y = np.arange(35).reshape(5, 7) 

# My ultimate goal is to do a slice similar to this expression, but this of course gives 
# an error. 
print y[[1, 2], [0, 2:-1]] 

# This works, but I feel it is inefficient, although I could be wrong. 
print np.hstack((y[[1, 2], 0][:, np.newaxis], y[[1, 2], 2:-1])) 

任何建议将不胜感激。

回答

2

我不知道这是不是你问什么,但尝试

In [11]: y[2:4,[1,3,4,5,6]] 
Out[11]: 
array([[15, 17, 18, 19, 20], 
     [22, 24, 25, 26, 27]]) 

In [12]: 

numpy的可切片类似于标准的Python列表,但尺寸增加一些trickiness,但我仍然觉得这个解决方案是与嵌套或循环重塑相比非常优雅,但有时​​候这并不总是最终全部解决方案。

编辑:

它看起来并不好,但它比重塑或巨大的矩阵更好的改变

这等于说y[1:3, [0, 2:-1]],而无需重塑阵列或通过多余的元素进行迭代,你通过制作该维度中其余列的[0] +列表来指定您关心的索引。

In [33]: y[1:3, [0] + list(xrange(2,y.shape[1]))] 
Out[33]: 
array([[ 7, 9, 10, 11, 12, 13], 
     [14, 16, 17, 18, 19, 20]]) 
+0

对不起,我是不够具体。我需要列2:-1的原因是有时我会在中间有更多的列,但从不在数组的开始或结束。 – hotshotiguana

+0

如果你做'y [2:4,1:-1]',你将有2,3行和所有'内'列。 – lukecampbell

+0

我对原始问题进行了编辑,因为除了“内部”列以外,还需要第一列。 – hotshotiguana