1

我有一個導入具有形狀(1027,888,3)的ndarray中的圖像。通過dynamcaly生成的索引在numpy ndarray中進行索引

我的任務是創建一個方法,該方法返回2個索引的一維數組,從圖像中選擇一個圖塊。

ii, jj = tile_cordinates(i,j, tile_size) 
imshow(image[ii,jj]) 

我想模擬相同的結果,使用此代碼:

imshow(image[1:32, 2:32]) 

我試着這樣做:

def tile_coordinates(i, j, tile_size): 
    return range(i, i + tile_size), range(j, j + tile_size) 
ii, jj = tile_coordinates(1,2,32) 
imshow(image[ii,jj]) 

但圖像是不正確的。事實上,結果回報形式與兩個數組索引圖像是(32,3),而使用

image[1:32, 2:32].shape 

返回(31,30,3)

因此,如何以形成返回的數組形成tile_coordinates方法來模擬與切片示例相同的結果?它甚至有可能嗎?

PS:規格從作業分配中設置。我已經花了幾個小時看文檔和索引的其他例子,但沒有發現任何可以做我需要的東西。所以我很困難。任何指導將非常感激:)

謝謝!

+0

你肯定你需要「一維」的陣列?一般來說,如果你希望索引操作的輸出是2d,你的索引器應該可以廣播到2d,否則你需要做一些手動重定形([here](http://docs.scipy.org) /doc/numpy/reference/arrays.indexing.html#advanced-indexing)是相應的doc部分)。 – immerrr 2014-10-19 15:56:15

+0

感謝您的文檔參考。 這是任務的規格: 「瓷磚可以在空間上的行和列排列,類似於像素因此,我們也可以知道哪些像素在第i行的瓷磚j列跨度 下面你必須完成。函數tile_coordinates的實現,它給出了這個問題的答案,函數應該返回兩個1維數組,第一個提供給定tile的行座標,第二個提供列座標。據我瞭解,是的,它需要一維。 – JustmeVSI 2014-10-19 16:35:45

回答

1

您正在尋找slice內置。 image[1:32, 2:32]可以表示爲image[slice(1,32), slice(2,32)]

def tile_coordinates(i, j, tile_size): 
    return slice(i, i + tile_size), slice(j, j + tile_size) 
+0

這工作,雖然返回的結果不是數組,我會去解決這個問題。感謝你們! – JustmeVSI 2014-10-19 20:20:51

0

無需擔心廣播,選擇可以作爲一個兩階段過程來完成,這很容易理解(首先,沿軸0選擇,然後沿軸1選擇)。如果你願意來檢查,你可以看到第一個索引減少一個軸的尺寸爲32

image[ii][:,jj] #has shape (32, 32, 3)