7

(40,20,30) numpy 配列があり、いくつかの作業の後、選択した入力軸に沿って入力配列の半分を返す関数があるとします。そうする自動方法はありますか?私はそのような醜いコードを避けたい:

def my_function(array,axis=0):

    ...

    if axis == 0:
        return array[:array.shape[0]/2,:,:] --> (20,20,30) array
    elif axis = 1:
        return array[:,:array.shape[1]/2,:] --> (40,10,30) array
    elif axis = 2: 
        return array[:,:,:array.shape[2]/2] --> (40,20,15) array

ご協力いただきありがとうございます

エリック

4

3 に答える 3

8

np.splitこの[docs]に使用できると思います。必要に応じて、返された最初または2番目の要素を取得します。例えば:

>>> a = np.random.random((40,20,30))
>>> np.split(a, 2, axis=0)[0].shape
(20, 20, 30)
>>> np.split(a, 2, axis=1)[0].shape
(40, 10, 30)
>>> np.split(a, 2, axis=2)[0].shape
(40, 20, 15)
>>> (np.split(a, 2, axis=0)[0] == a[:a.shape[0]/2, :,:]).all()
True
于 2013-05-24T14:56:42.403 に答える
2

numpy.rollaxisこれには良いツールです:

def my_func(array, axis=0):
    array = np.rollaxis(array, axis)
    out = array[:array.shape[0] // 2]
    # Do stuff with array and out knowing that the axis of interest is now 0
    ...

    # If you need to restore the order of the axes
    if axis == -1:
        axis = out.shape[0] - 1
    out = np.rollaxis(out, 0, axis + 1)
于 2013-05-24T17:09:15.927 に答える