微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从二维数组 Python 中提取索引

如何解决从二维数组 Python 中提取索引

我有一张形状为 gray_image 的图像(名为 (1830,1830))。经过一些图像处理(我创建了超像素)后,我得到了一个名为 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 维度的二维数组:

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

我需要创建一个算法来输出形状为 arr 的数组 (3,3)

 arr = np.array([[1,2]  # on the first line are the values from gray_image that correspond with value 0 from segments
                 [1,3]  # on the second line are the values from gray_image that correspond with value 1 from segments
                 [2,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 是常数,标签数量 M x {{1 }} 与图像大小相同。如果不是这种情况,则无法构造 2D numpy 数组作为结果。

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

N

如果你的标签不利于数组输出,上面的结果仍然有用。与其将 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 labelsarr 轻松地将结果转换为字典:

lst

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。