2013-05-24 21 views
5

sagen, dass ich ein (40,20,30) numpy Array habe und dass ich eine Funktion habe, die nach einiger Arbeit die Hälfte des Eingabearrays entlang einer ausgewählten Eingabeachse zurückgibt. Gibt es einen automatischen Weg dazu? Ich möchte so einen hässlichen Code vermeiden:Slicing numpy Array entlang einer beliebigen Dimension

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 

Dank für Ihre Hilfe

Eric

Antwort

6

ich Sie np.split denken für diese [docs] verwenden können, und nehmen Sie einfach das erste oder zweite Element zurückgegeben, je nachdem, was du willst. Zum Beispiel:

>>> 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 
+0

FYI: split() nimmt auch ein Tupel beliebige Splitpunkte angeben. – mhsmith

4

danke für Ihre Hilfe, DSM. Ich werde deinen Ansatz verwenden.

In der Zwischenzeit habe ich einen (dirty?) Hacken:

>>> a = np.random.random((40,20,30)) 
>>> s = [slice(None),]*a.ndim 
>>> s[axis] = slice(f,l,s) 
>>> a1 = a[s] 

Vielleicht ein wenig allgemeiner als np.split aber viel weniger elegant!

2

numpy.rollaxis ist ein gutes Werkzeug dafür:

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) 
Verwandte Themen