切片中的可变维数

时间:2014-06-30 11:17:26

标签: python arrays numpy

我有一个名为resultsten的多维数组,其形状如下

print np.shape(resultsten)
(3, 3, 6, 10, 1, 9)

在某些情况下,我在名为cleanup的程序中使用此数组的一部分,然后将此数组分为xyz阵列:

x,y,z = cleanup(resultsten[0,:,:,:,:,:])

def cleanup(resultsmat):
    x = resultsmat[:,:,:,:,2]
    y = resultsmat[:,:,:,:,1]
    z = resultsmat[:,:,:,:,4]
    return x,y,z

但是,我也可能不希望将resultsten的整个矩阵放在我的程序cleanup中,因此:

x,y,z = cleanup(resultsten[0,0,:,:,:,:])

这当然会给出错误,因为cleanup的索引与预期的索引不匹配。 我想知道切片中是否可以包含可变数量的尺寸。

我想知道一个命令,它会获取每个维度的所有条目,直到最后一个维度,只需要一个索引。

我已经看到除了第一个之外的所有维度都可以这样做,例如

resultsten[1,:,:,:,:,:]

给出与以下相同的结果:

resultsten[1,:]

我试过了:

resultsten[:,1]

但它没有提供所需的结果,Python解释如下:

resultsten[:,1,:,:,:,:]

MWE:

def cleanup(resultsmat):
    x = resultsmat[:,:,:,0,2]
    y = resultsmat[:,:,:,0,1]
    z = resultsmat[:,:,:,0,4]
    return x,y,z

resultsten=np.arange(3*3*6*10*1*9).reshape(3,3,6,10,1,9)

x0,y0,z0 = cleanup(resultsten[0,:,:,:,:,:]) #works
x0,y0,z0 = cleanup(resultsten[0,0,:,:,:,:]) #does not work

1 个答案:

答案 0 :(得分:0)

我会使用切片对象列表:

import numpy as np
A = np.arange(2*3*4*5).reshape(2,3,4,5)


#[:] <-> [slice(None,None, None)]
sliceList = [slice(None, None, None)]*(len(A.shape)-1)
a,b,c,d,e = [A[sliceList+[i]] for i in range(A.shape[-1])]

输出:

>>> A[:,:,:,0]
array([[[  0,   5,  10,  15],
        [ 20,  25,  30,  35],
        [ 40,  45,  50,  55]],

       [[ 60,  65,  70,  75],
        [ 80,  85,  90,  95],
        [100, 105, 110, 115]]])

>>> a
array([[[  0,   5,  10,  15],
        [ 20,  25,  30,  35],
        [ 40,  45,  50,  55]],

       [[ 60,  65,  70,  75],
        [ 80,  85,  90,  95],
        [100, 105, 110, 115]]])