2016-02-11 567 views
2

我正在處理圖像處理問題,並且我的數據以三維NumPy數組的形式呈現,其中(x,y,z)條目是圖像z的(x,y)像素(數值強度值)。有100000個圖像,每個圖像是25x25。因此,數據矩陣的大小爲25x25x10000。我試圖將其轉換爲尺寸爲10000x625的2維矩陣,其中每行都是圖像中像素的線性化。例如,假設而不是圖像是3×3,我們有以下幾點:將三維NumPy數組轉換爲二維NumPy數組時出現問題

1 2 3 
4 5 6 ------> [1, 2, 3, 4, 5, 6, 7, 8, 9] 
7 8 9 

我試圖通過調用data.reshape((10000, 625))要做到這一點,但是數據不再這樣做後正確對齊。我曾嘗試在重塑的有效階段轉置矩陣,但似乎沒有解決它。

有誰知道如何解決這個問題?

回答

0

如果你想要數據對齊,你需要做data.reshape((625, 10000))

如果你想有一個不同的佈局嘗試np.rollaxis

data_rolled = np.rollaxis(data, 2, 0) # This is Shape (10000, 25, 25) 
data_reshaped = data_rolled.reshape(10000, 625) # Now you can do your reshape. 

numpy的需要你知道哪些元素重塑過程中屬於彼此,所以只有「合併」屬於一個整體的尺寸。

0

問題是,您不符合reshape調用中的標準索引順序。如果要組合的兩個維度在新陣列中位於相同位置( - >(625, 10000)),則只會對齊數據。

然後,要獲得想要的形狀,可以轉置。用一個較小的例子更容易看出來 - 當遇到這樣的問題時,如果可以的話,總是在REPL中嘗試一個更小的例子。

>>> a = numpy.arange(12) 
>>> a = a.reshape(2, 2, 3) 
>>> a 
array([[[ 0, 1, 2], 
     [ 3, 4, 5]], 

     [[ 6, 7, 8], 
     [ 9, 10, 11]]]) 
>>> a.reshape(4, 3) 
array([[ 0, 1, 2], 
     [ 3, 4, 5], 
     [ 6, 7, 8], 
     [ 9, 10, 11]]) 
>>> a.reshape(4, 3).T 
array([[ 0, 3, 6, 9], 
     [ 1, 4, 7, 10], 
     [ 2, 5, 8, 11]]) 

不需要rollaxis

請注意numpy使用的打印佈局如何使這種推理更容易。第一步和第二步之間的差異僅在的支架位置處爲;數字都留在同一個地方,當你想要考慮形狀問題時,這通常會有所幫助。