2014-12-20 73 views
0

到目前爲止,我做我想做的事是如下NumPy的和2-d陣列的不同

ar2 = [[0 for t in range(maxy-miny)] for t in range(maxx-minx)] 

for first,x in enumerate(range(minx, maxx)): 
    for second,y in enumerate(range(miny, maxy)): 
     ar2[first][second] = a[x][y] 

io.imshow(ar2) 

的問題是,它真的很慢。所以我正在考慮numpy。

ar = np.zeros((maxx-minx, maxy-miny), dtype=np.ndarray) 

for first,x in enumerate(range(minx, maxx)): 
    for second,y in enumerate(range(miny, maxy)): 
     ar[first][second] = a[x][y] 

io.imshow(ar) 

雖然在第二種情況下,圖像將不會顯示

TypeError: Image data can not convert to float 

我試圖檢查可能什麼,所以我測試AR [0] & AR2 [0]

輸出2-d陣列:

[array([230, 197, 204], dtype=uint8) array([241, 209, 214], dtype=uint8)
array([233, 201, 206], dtype=uint8) array([214, 183, 188], dtype=uint8)...

輸出numpy的陣列:

[array([230, 197, 204], dtype=uint8), array([241, 209, 214], dtype=uint8),

array([233, 201, 206], dtype=uint8), ...

因此很明顯,numpy的使用逗號,但我不明白如何以及爲什麼會發生。

+0

什麼是'了'...? –

+0

@AndyHayden它是原始圖像的二維數組。我發現哪些部分對我感興趣,我想將它們單獨轉移到新的部分。 – Rentonie

+0

由於@ sebix表示它不是一個合適的2D numpy數組(dtype不正確)。空間與逗號之間的東西是一條紅色的鯡魚,純粹是如何打印對象。 –

回答

1

您使用的dtype不是有效的數字類型,您使用np.ndarray作爲數組中各個值的類型。

import matplotlib.pyplot as plt 
import numpy as np 

ar = np.zeros((maxx-minx, maxy-miny)) 
a = plt.imread('something.jpg') 

for first,x in enumerate(range(minx, maxx)): 
    for second,y in enumerate(range(miny, maxy)): 
     ar[first][second] = a[x][y] 

plt.imshow(ar) 

這應該工作 - 但是你沒有提供足夠的信息來測試可靠。

我也推薦使用plt作爲matplotlib.pyplot的縮寫,而不是io,它可以很容易地與實際的io模塊混合使用。

但是,可以達到同樣的目標,但不是循環都:

ar3[0:maxx-minx, 0:maxy-miny] = a[minx:maxx,miny:maxy] 
np.allclose(ar2, ar3) # True 
+0

雖然我得到「ValueError:設置一個序列的數組元素」。我以前也使用過「從skimage import io」。 – Rentonie

+0

我無法重現。請提供完全可重複的代碼片。我還添加了一個無循環工作的解決方案。 – sebix