2016-11-26 66 views
1

我有一個3D數組的列表,它們都是不同的形狀,但我需要它們都是相同的形狀。此外,該形狀需要是列表中最小的形狀。例如,如果三個數組的my_list具有形狀(115,115,3),(111,111,3)和(113,113,3),則它們都需要是(111,111,3)。它們都是方形彩色圖像,所以它們將具有形狀(x,x,3)。如何重塑Python中的列表中的多個數組

所以,我有兩個主要問題:

  • 我如何找到最小的形狀沒有數組或循環保持一個變量在創建列表?
  • 如何有效地將列表中的所有數組設置爲最小形狀?

目前我保持了最小的形狀的變量,同時創造my_list這樣我就可以做到這一點:

for idx, img in enumerate(my_list): 
    img = img[:smallest_shape,:smallest_shape] 
    my_list[idx] = img 

我只是覺得這不是最有效的方式,而且我也意識到我通過切片失去價值,但我期待這一點。

+0

1.如果沒有循環遍歷整個事物,你就找不到最小的值,除非你知道它們是排序的。然而,排序成本不僅僅是找到最小的一個。 2.通過切片設置已經非常有效,因爲內部numpy創建視圖對象而不是複製東西。 – Kh40tiK

+0

正在爲您加載選項時調整圖像大小?這將確保所有圖像具有相同的形狀。 – OddNorg

+0

你想讓它們成爲中心焦點嗎?或者你只是想將多餘的行整理到右側和底部,還是左側和頂部? – NaN

回答

2

我構建了

In [513]: alist=[np.ones((512,512,3)) for _ in range(100)] 

樣本名單,做了一些時機。

收集形狀是快:

In [515]: timeit [a.shape for a in alist] 
10000 loops, best of 3: 31.2 µs per loop 

以最小花費更多的時間:

In [516]: np.min([a.shape for a in alist],axis=0) 
Out[516]: array([512, 512, 3]) 
In [517]: timeit np.min([a.shape for a in alist],axis=0) 
1000 loops, best of 3: 344 µs per loop 

切片更快

In [518]: timeit [a[:500,:500,:] for a in alist] 
10000 loops, best of 3: 133 µs per loop 

現在嘗試找出min步驟。

In [519]: shapes=[a.shape for a in alist] 
In [520]: timeit np.min(shapes, axis=0) 
The slowest run took 5.75 times longer than the fastest. This could mean that an intermediate result is being cached. 
10000 loops, best of 3: 136 µs per loop 

當您有對象列表時,迭代是處理所有元素的唯一方法。看代碼np.hstacknp.vstack(和其他)。他們做一個或多個列表推導,以將所有輸入數組按正確的形狀進行按摩。然後他們做np.concatenate這也迭代,但在編譯代碼。

+1

謝謝,我沒有想過要查看這樣的源代碼。我會讚揚你的迴應,但是我沒有足夠的聲望,因爲我在過去十年中只有過去的觀點。 – wrestang