2013-03-14 15 views
5

x2_Kaxs to tablica z liczbami Nx3, a elementy z tej listy indeksują do innej tablicy. Chcę skończyć z listą Nx3 z listą indeksowanych elementów.Wymuś numpy, aby lista była przechowywana.

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

Powoduje wyprowadzenie tablicy (N * 3) x1 z numpy tablic. wspaniały. to prawie działa na to, co chcę. Wszystko, co muszę zrobić, to zmienić to.

x2_Kcids.shape = x2_Kaxs.shape 

To działa. x2_Kcids staje się tablicą Nx3 z numpy tablic. Idealny.

Wszystkie listy w x2_Kaxs zawierają tylko jeden element. Następnie spłaszcza ona do tablicy Nx3 liczb całkowitych, a mój kod oczekuje, że lista będzie później w potoku.

Jednym z rozwiązań, które wymyśliłem, było dodanie elementu dummy, a następnie wyskoczenie z niego, ale jest to bardzo brzydkie. Czy jest coś ładniejszego?

Odpowiedz

0

podobne do @Denis:

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

Twój problem nie jest tak naprawdę o listach wielkości 1, chodzi o listę wszystkich o tej samej wielkości. Stworzyłem to obojętne próbek:

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 

Jeśli uruchomić kod na tych trzech, zwrot ma następujące kształty:

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

a sprawa ze wszystkich list o długości 2, nie będzie nawet pozwól zmienić kształt na (n, 3). Problem polega na tym, że nawet przy dtype=object, numpy próbuje numerować twój wkład jak najwięcej, co jest aż do poszczególnych elementów, jeśli wszystkie listy są tej samej długości. Myślę, że najlepiej jest do przydzielenia swoją tablicę x2_Kcids:

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 Ponieważ odpowiedź unubtu jest już widoczny, mam zamiar ukraść z niego. Powyższy kod może być znacznie bardziej ładnie i zwięźle napisany jako:

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

W powyższym przykładzie pojedynczych list item:

>>> 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 Ponieważ usuniętych swoją odpowiedź, mam bezczelnie skopiowane twoja spłaszczona tablica po lewej stronie przypisania w edycji do mojej odpowiedzi. Musiał jednak iść z '.ravel()', ponieważ '.flat' dawał dziwne wyniki. – Jaime

Powiązane problemy