[英]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
您可以通過壓縮labels
和arr
或lst
輕松地將結果轉換為字典:
dct = dict(zip(labels, lst)) # Works with arr too
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.