2012-06-28 53 views
6

提取多维数组的一个片段我知道如何采取x[:,:,:,:,j,:](它采用维度4的第j片)。蟒蛇:提取维数索引

如果尺寸在运行时是已知的,并且不是已知的常量,是否有办法做同样的事情?

+1

“x [something]”形式的索引与调用对象的__getitem__方法是同义的。例如,上面的代码相当于将元组'(片(无),片(无),片(无),片(无),j,片(无))'传递给'x .__ getitem __()' 。 –

+1

@JoelCornett:为什么你会使用'__getitem __()'这个?与'[]'相比,有什么优势? –

+0

@SvenMarnach:我不会,我只是觉得OP会从理解这个概念中受益。他的问题的答案是微不足道的,如果他意识到这只是一个将参数传递给函数的问题。 –

回答

6

可以使用slice功能,并与调用它运行期间的适当变量列表如下:

# Store the variables that represent the slice in a list/tuple 
# Make a slice with the unzipped tuple using the slice() command 
# Use the slice on your array 

例子:

>>> from numpy import * 
>>> a = (1, 2, 3) 
>>> b = arange(27).reshape(3, 3, 3) 
>>> s = slice(*a) 
>>> b[s] 
array([[[ 9, 10, 11], 
     [12, 13, 14], 
     [15, 16, 17]]]) 

这是一样的:

>>> b[1:2:3] 
array([[[ 9, 10, 11], 
     [12, 13, 14], 
     [15, 16, 17]]]) 

最后,在平时的符号不指定2 :之间的任何东西相当于是把那些地方None元组中的你创建。

8

一个选择这样做,是构建编程切片:

slicing = (slice(None),) * 4 + (j,) + (slice(None),) 

另一种方法是使用numpy.take()ndarray.take()

>>> a = numpy.array([[1, 2], [3, 4]]) 
>>> a.take((1,), axis=0) 
array([[3, 4]]) 
>>> a.take((1,), axis=1) 
array([[2], 
     [4]]) 
+0

numpy.take看起来像我在这里使用的正确的东西。 –

+0

如何使用'slicing'从'x'中提取某些内容? –