簡體   English   中英

從二維數組 Python 中提取索引

[英]extracting index from a 2D array Python

我有一個形狀(1830, 1830)的圖像(名為gray_image )。 經過一些圖像處理(我創建了超像素),我得到了一個名為segments的二維數組(形狀為(1830, 1830) ),其中包含從 0 到 72 的值。

我需要從在segments中找到值“0”的位置獲取索引,並使用該索引將gray_image中的值保存在新數組中(命名為: arr )。

我認為一個示例將幫助您更好地理解我的問題:

假設我有這個圖像,一個 3x3 維度的二維數組:

gray_image = numpy.array([[1, 1, 1],
                          [2, 2, 2],
                          [3, 3, 3]])

這是我的段數組,一個 3x3 維度的 2D 數組:

segments = numpy.zeros([[0, 0, 1],
                        [0, 1, 2],
                        [1, 2, 2]])

我需要創建一個算法來輸出形狀為(3, 3)的數組arr

 arr = np.array([[1, 1, 2]  # on the first line are the values from gray_image that correspond with value 0 from segments
                 [1, 2, 3]  # on the second line are the values from gray_image that correspond with value 1 from segments
                 [2, 3, 3]]) # on the third line are the values from gray_image that correspond with value 2 from segments

我剛剛意識到每個段的數字計數是不同的,所以我不確定這是否可以使用 2D 數組。 我正在考慮使用諸如字典之類的集合來保存與索引相關的所有信息。

所以,這是我到目前為止所做的:

i = 0
j = 0
k = 0
n = 0
m = 0
arr = np.empty([1830, 1830]) # empty array
for k in range(0, 72):
     for i in range(0,1829):
         for j in range(0,1829):                      
             if segments[i][j] == k:
                 arr[m][n] = gray_image[i][j]
                 n = n + 1
             if i == 1829 and j == 1829:
                 m = m + 1

但這根本不起作用,我遇到了這個錯誤:

arr[m][n] = gary_image[i][j]

IndexError: index 1830 is out of bounds for axis 0 with size 1830

我有點堅持了幾天,所以任何建議都將受到高度贊賞。

首先,假設您的標簽數組有利於制作 numpy 數組,即每個 label N的元素數量是恆定的,標簽數量M x N與圖像大小相同。 如果不是這種情況,則無法構造二維 numpy 數組作為結果。

訣竅是識別區域。 為此,我們將使用np.argsort

idxa = np.argsort(segments, axis=None).reshape(m, n)
arr = gray_image.ravel()[idxa]

如果你的標簽不利於數組output,上面的結果還是有用的。 與其將idx重塑為正確的 output 形狀,不如將其保持原樣並找出拆分索引以列出 arrays:

idxl = np.argsort(segments, axis=None)
splits = np.flatnonzero(np.diff(segments.ravel()[idxl])) + 1
lst = np.split(gray_image.ravel()[idxl], splits)

對應於每個段的 label 不必從零開始或以任何方式特殊,因此您可能希望將值作為與arr / lst長度相同的數組獲取:

labels = segments.ravel()[idxa[:, 0]]  # For arr-based solution
labels = segments.ravel()[idxl[np.r_[0, splits]]] # For lst-based solution

您可以通過壓縮labelsarrlst輕松地將結果轉換為字典:

dct = dict(zip(labels, lst))  # Works with arr too

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM