2013-03-14 183 views
5

x2_Kaxs是一個Nx3 numpy列表數組,並且這些列表中的元素會索引到另一個數組中。我想最終得到一個Nx3 numpy的索引元素列表數組。強制numpy保留列表

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

這輸出一個(N * 3)X1陣列的numpy陣列。大。這幾乎適用於我想要的東西。我需要做的就是重塑它。

x2_Kcids.shape = x2_Kaxs.shape 

這個工程。 x2_Kcids成爲nx3陣列的numpy陣列。完善。

除了x2_Kaxs中的所有列表中只有一個元素。然後它將 變成一個Nx3整數數組,並且我的代碼需要在管道後面列出一個列表。

我提出的一個解決方案是追加一個虛擬元素,然後彈出它,但這是非常醜陋的。有什麼更好的嗎?

回答

0

類似@Denis:

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

你的問題是不是真正的大小爲1的列表,它是關於列表中的所有大小相同的。我創造了這個僞採樣:如果我們在這三個運行代碼

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 

,返回具有以下形狀:

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

而且長度爲2的所有列表的情況下甚至不會讓你重塑爲(n, 3)。問題在於,即使使用dtype=object,numpy也會盡可能多地嘗試numpify您的輸入,如果所有列表的長度相同,那麼它將一直延伸到單個元素。我認爲,最好的辦法是預先分配的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 

編輯由於unubtu的回答不再是可見的,我會從他身上偷。上面的代碼可以更加精美,簡潔寫成:

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

使用單項目列表的上面的例子:

>>> 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既然你刪除了你的答案,我無恥地複製你的平面陣列在作業的左側分配給我的答案。不過,必須使用'.ravel()',因爲'.flat'給出了奇怪的結果。 – Jaime 2013-03-14 19:33:41