2013-03-14 12 views
5

x2_Kaxs ist ein Nxpy-Array von Nx3-Listen, und die Elemente in diesen Listen werden in ein anderes Array indexiert. Ich möchte mit einem nxpy Nx3 Array von Listen dieser indizierten Elemente enden.Force numpy, um eine Liste zu behalten

x2_Kcids = array([ ax2_cid[axs] for axs in x2_Kaxs.flat ], dtype=object) 

Dies gibt ein (N * 3) x1-Array von numpigen Arrays aus. groß. das funktioniert fast so, wie ich es möchte. Alles, was ich tun muss, ist, es neu zu gestalten.

x2_Kcids.shape = x2_Kaxs.shape 

Und das funktioniert. x2_Kcids wird zu einem Nx3-Array mit numpigen Arrays. Perfekt.

Außer allen Listen in x2_Kaxs haben nur ein Element in ihnen. Dann flacht es es in ein Nx3-Array von ganzen Zahlen, und mein Code erwartet eine Liste später in der Pipeline.

Eine Lösung, die ich fand, war ein Dummy-Element anzuhängen und dann abzusetzen, aber das ist sehr hässlich. Gibt es etwas Schöneres?

Antwort

0

Ähnlich @Denis:

if x.ndim == 2: 
    x.shape += (1,) 
2

Ihr Problem ist wirklich nicht über Listen der Größe 1 handelt es sich um die Liste aller von der gleichen Größe. Ich habe dieses Blindproben erstellt:

ax2_cid = np.random.rand(10) 
shape = (10, 3) 

x2_Kaxs = np.empty((10, 3), dtype=object).reshape(-1) 
for j in xrange(x2_Kaxs.size): 
    x2_Kaxs[j] = [random.randint(0, 9) for k in xrange(random.randint(1, 5))] 
x2_Kaxs.shape = shape 

x2_Kaxs_1 = np.empty((10, 3), dtype=object).reshape(-1) 
for j in xrange(x2_Kaxs.size): 
    x2_Kaxs_1[j] = [random.randint(0, 9)] 
x2_Kaxs_1.shape = shape 

x2_Kaxs_2 = np.empty((10, 3), dtype=object).reshape(-1) 
for j in xrange(x2_Kaxs_2.size): 
    x2_Kaxs_2[j] = [random.randint(0, 9) for k in xrange(2)] 
x2_Kaxs_2.shape = shape 

Wenn wir den Code auf diesen drei laufen, hat die Rückkehr folgende Formen:

>>> np.array([ax2_cid[axs] for axs in x2_Kaxs.flat], dtype=object).shape 
(30,) 
>>> np.array([ax2_cid[axs] for axs in x2_Kaxs_1.flat], dtype=object).shape 
(30, 1) 
>>> np.array([ax2_cid[axs] for axs in x2_Kaxs_2.flat], dtype=object).shape 
(30, 2) 

und den Fall mit allen Listen der Länge 2 wird nicht einmal Lassen Sie sich auf (n, 3) umformen. Das Problem ist, dass selbst mit dtype=object, versucht numpy Ihre Eingabe so viel wie möglich, die den ganzen Weg hinunter zu einzelnen Elementen ist, wenn alle Listen von gleicher Länge sind. Ich denke, dass die beste Wahl Ihre x2_Kcids Array vorzubelegen ist:

x2_Kcids = np.empty_like(x2_Kaxs).reshape(-1) 
shape = x2_Kaxs.shape 
x2_Kcids[:] = [ax2_cid[axs] for axs in x2_Kaxs.flat] 
x2_Kcids.shape = shape 

EDIT Da unubtu Antwort ist nicht mehr zu sehen, die ich von ihm stehlen werde. Der obige Code kann viel mehr schön sein und kompakt geschrieben wie:

x2_Kcids = np.empty_like(x2_Kaxs) 
x2_Kcids.ravel()[:] = [ax2_cid[axs] for axs in x2_Kaxs.flat] 

Mit dem obigen Beispiel für einzelne Stücklisten:

>>> x2_Kcids_1 = np.empty_like(x2_Kaxs_1).reshape(-1) 
>>> x2_Kcids_1[:] = [ax2_cid[axs] for axs in x2_Kaxs_1.flat] 
>>> x2_Kcids_1.shape = shape 
>>> x2_Kcids_1 
array([[[ 0.37685372], [ 0.95328117], [ 0.63840868]], 
     [[ 0.43009678], [ 0.02069558], [ 0.32455781]], 
     [[ 0.32455781], [ 0.37685372], [ 0.09777559]], 
     [[ 0.09777559], [ 0.37685372], [ 0.32455781]], 
     [[ 0.02069558], [ 0.02069558], [ 0.43009678]], 
     [[ 0.32455781], [ 0.63840868], [ 0.37685372]], 
     [[ 0.63840868], [ 0.43009678], [ 0.25532799]], 
     [[ 0.02069558], [ 0.32455781], [ 0.09777559]], 
     [[ 0.43009678], [ 0.37685372], [ 0.63840868]], 
     [[ 0.02069558], [ 0.17876822], [ 0.17876822]]], dtype=object) 
>>> x2_Kcids_1[0, 0] 
array([ 0.37685372]) 
+0

@unubtu Da Sie Ihre Antwort gelöscht habe ich schamlos kopiert Ihr abgeflachtes Array auf der linken Seite in einer Bearbeitung meiner Antwort. Musste allerdings mit '.ravel()' gehen, da '.flat' seltsame Ergebnisse lieferte. – Jaime

Verwandte Themen