从二维数组中提取索引 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 维度的二维数组:
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
我刚刚意识到每个段的数字计数不同,所以我不确定二维数组是否可行。我在考虑用字典之类的集合来保存所有与索引相关的信息。
所以,这是我到目前为止所做的:
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 N
与图片大小相同。如果不是这种情况,则无法构造 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
/[=20 相同的数组=]:
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
我有一张形状为 (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 维度的二维数组:
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
我刚刚意识到每个段的数字计数不同,所以我不确定二维数组是否可行。我在考虑用字典之类的集合来保存所有与索引相关的信息。
所以,这是我到目前为止所做的:
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 N
与图片大小相同。如果不是这种情况,则无法构造 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
/[=20 相同的数组=]:
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