从2D数组Python中提取索引



我有一个形状为(1830, 1830)的图像(命名为gray_image(。经过一些图像处理(我创建了超像素(,我得到了一个名为segments(形状为(1830, 1830)(的2D阵列,其中包含0到72的值。

我需要从我找到值";0";在segments中,并使用该索引将来自gray_image的值保存在新数组(名为:arr(中。

我想举个例子可以帮助你更好地理解我的问题:

假设我有这个图像,一个3x3维度的2D阵列:

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数组,即每个标签N的元素数量是恒定的,标签MxN的数量与图像大小相同。如果不是这样的话,那么就不能构造一个2D numpy数组作为结果。

诀窍是识别区域。为此,我们将使用np.argsort:

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

如果您的标签不利于数组输出,那么上面的结果仍然有用。与其将idx重塑为正确的输出形状,不如保持原样,并计算出拆分索引以形成阵列列表:

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

每个段对应的标签不必是基于零的,也不必以任何方式特殊,因此您可能希望获得与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

最新更新