Konvertieren Sie ein numpy Array in ein Array von numpy Arrays

Wie kann ich numpy Array a zu numpy Array b in einer (num) pythonic Weise konvertieren? Lösung sollte idealerweise für beliebige Dimensionen und Array-Längen arbeiten.

 import numpy as np a=np.arange(12).reshape(2,3,2) b=np.empty((2,3),dtype=object) b[0,0]=np.array([0,1]) b[0,1]=np.array([2,3]) b[0,2]=np.array([4,5]) b[1,0]=np.array([6,7]) b[1,1]=np.array([8,9]) b[1,2]=np.array([10,11]) 

  • Lineare Kombinationen in Python / Numpy
  • Ist scipy logsumexp () mit der Unterlauf-Herausforderung beschäftigt?
  • Bekomme numpy Array von Pygame
  • Python Entfernen von Array Items innerhalb für Loop
  • Reshape Array auf xAxis und fülle mit Mittelwert in Python?
  • Die längste zunehmende Untersequenz
  • 2 Solutions collect form web for “Konvertieren Sie ein numpy Array in ein Array von numpy Arrays”

    Für den Anfang:

     In [638]: a=np.arange(12).reshape(2,3,2) In [639]: b=np.empty((2,3),dtype=object) In [640]: for index in np.ndindex(b.shape): b[index]=a[index] .....: In [641]: b Out[641]: array([[array([0, 1]), array([2, 3]), array([4, 5])], [array([6, 7]), array([8, 9]), array([10, 11])]], dtype=object) 

    Es ist nicht ideal, da es Iteration nutzt. Aber ich frage mich, ob es sogar möglich ist, auf die Elemente von b auf andere Weise zuzugreifen. Durch die Verwendung von dtype=object brechen Sie die grundlegende Vektorisierung, die numpy bekannt ist. b ist im Wesentlichen eine Liste mit numpy Multiarray Form Overlay. dtype=object stellt eine undurchdringliche Wand um diese Größe 2 Arrays.

    Zum Beispiel gibt mir a[:,:,0] alle geraden Zahlen in einem (2,3) Array. Ich kann diese Zahlen nicht von b mit nur Indizierung bekommen. Ich muss Iteration verwenden:

     [b[index][0] for index in np.ndindex(b.shape)] # [0, 2, 4, 6, 8, 10] 

    np.array versucht, die höchste Dimension Array, dass es kann, da die Regelmäßigkeit der Daten zu machen. Um es zu einer Reihe von Objekten zu täuschen, müssen wir eine unregelmäßige Liste von Listen oder Objekten geben. Zum Beispiel könnten wir:

     mylist = list(a.reshape(-1,2)) # list of arrays mylist.append([]) # make the list irregular b = np.array(mylist) # array of objects b = b[:-1].reshape(2,3) # cleanup 

    Die letzte Lösung deutet darauf hin, dass meine erste kann ein bisschen aufgeräumt werden:

     b = np.empty((6,),dtype=object) b[:] = list(a.reshape(-1,2)) b = b.reshape(2,3) 

    Ich vermute, dass unter den Deckungen die list() call eine Iteration wie

     [x for x in a.reshape(-1,2)] 

    So Zeit weise könnte es nicht viel anders sein als die ndindex Zeit.


    Eine Sache, die ich nicht von b erwartet habe, ist, dass ich Mathe darauf machen kann, mit fast der gleichen Allgemeingültigkeit wie auf a :

     b-10 b += 10 b *= 2 

    Eine Alternative zu einem Objekt dtype wäre ein strukturierter dtype, zB

     In [785]: b1=np.zeros((2,3),dtype=[('f0',int,(2,))]) In [786]: b1['f0'][:]=a In [787]: b1 Out[787]: array([[([0, 1],), ([2, 3],), ([4, 5],)], [([6, 7],), ([8, 9],), ([10, 11],)]], dtype=[('f0', '<i4', (2,))]) In [788]: b1['f0'] Out[788]: array([[[ 0, 1], [ 2, 3], [ 4, 5]], [[ 6, 7], [ 8, 9], [10, 11]]]) In [789]: b1[1,1]['f0'] Out[789]: array([8, 9]) 

    Und b und b1 können hinzugefügt werden: b+b1 (Erzeugung eines object ). Neugieriger und neugieriger!

    Basierend auf hpaulj habe ich eine viel allgemeinere Lösung. a ist ein Array von Dimension N, das in ein Array b der Dimension N1 mit dtype-Objekt-Holding-Arrays der Dimension (N-N1) umgewandelt werden soll. Im Beispiel N entspricht 5 und N1 gleich 3.

     import numpy as np N=5 N1=3 #create array a with dimension N a=np.random.random(np.random.randint(2,20,size=N)) a_shape=a.shape b_shape=a_shape[:N1] # shape of array b b_arr_shape=a_shape[N1:] # shape of arrays in b #Solution 1 with list() method (faster) b=np.empty(np.prod(b_shape),dtype=object) #init b b[:]=list(a.reshape((-1,)+b_arr_shape)) b=b.reshape(b_shape) print "Dimension of b: {}".format(len(b.shape)) # dim of b print "Dimension of array in b: {}".format(len(b[0,0,0].shape)) # dim of arrays in b #Solution 2 with ndindex loop (slower) b=np.empty(b_shape,dtype=object) for index in np.ndindex(b_shape): b[index]=a[index] print "Dimension of b: {}".format(len(b.shape)) # dim of b print "Dimension of array in b: {}".format(len(b[0,0,0].shape)) # dim of arrays in b 
    Python ist die beste Programmiersprache der Welt.