将 NumPy 数组矢量化重新标记为连续数字并取回

Posted

技术标签:

【中文标题】将 NumPy 数组矢量化重新标记为连续数字并取回【英文标题】:Vectorized relabeling of NumPy array to consecutive numbers and retrieving back 【发布时间】:2017-06-02 13:40:42 【问题描述】:

我有一个包含 4 个类的庞大训练数据集。这些类被非连续标记。为了能够应用顺序神经网络,必须重新标记类,以便类中的唯一值是连续的。此外,在脚本结束时,我必须将它们重新标记为旧值。

我知道如何用循环重新标记它们:

def relabel(old_classes, new_classes):
    indexes=[np.where(old_classes ==np.unique(old_classes)[i]) for i in range(len(new_classes))]
    for i in range(len(new_classes )):
        old_classes [indexes[i]]=new_classes[i]
    return old_classes

>>> old_classes = np.array([0,1,2,6,6,2,6,1,1,0])
>>> new_classes = np.arange(len(np.unique(old_classes)))
>>> relabel(old_classes,new_classes)
array([0, 1, 2, 3, 3, 2, 3, 1, 1, 0])

但这不是很好的编码,而且需要很多时间。

知道如何矢量化这种重新标记吗?


明确地说,我还希望能够将它们重新标记为旧值:

>>> relabeled_classes=np.array([0, 1, 2, 3, 3, 2, 3, 1, 1, 0])
>>> old_classes = np.array([0,1,2,6])
>>> relabel(relabeled_classes,old_classes )
array([0,1,2,6,6,2,6,1,1,0])

【问题讨论】:

【参考方案1】:

我们可以使用可选参数 return_inversenp.unique 来获取那些唯一的顺序 ID/标签,就像这样 -

unq_arr, unq_tags = np.unique(old_classes,return_inverse=1)

unq_tags 索引unq_arr 以检索回来-

old_classes_retrieved = unq_arr[unq_tags] 

示例运行 -

In [69]: old_classes = np.array([0,1,2,6,6,2,6,1,1,0])

In [70]: unq_arr, unq_tags = np.unique(old_classes,return_inverse=1)

In [71]: unq_arr
Out[71]: array([0, 1, 2, 6])

In [72]: unq_tags
Out[72]: array([0, 1, 2, 3, 3, 2, 3, 1, 1, 0])

In [73]: old_classes_retrieved = unq_arr[unq_tags]

In [74]: old_classes_retrieved
Out[74]: array([0, 1, 2, 6, 6, 2, 6, 1, 1, 0])

【讨论】:

但是我也可以使用它来将它们重新标记为旧值吗? @WilmarvanOmmeren 你试过了吗?这将重新标记与您使用 relabel 函数实现的相同,除非您在谈论其他类型的重新标记? 是的,当我将它们从非连续重新标记为连续时,它会起作用。但不是当我想将它们重新标记回它们的旧值时(如此连续到非连续)。抱歉,我将示例扩展为更清楚! 太棒了!非常感谢,这将为我节省很多时间! 我在这里写了一个库可以有效地做到这一点github.com/seung-lab/fastremap

以上是关于将 NumPy 数组矢量化重新标记为连续数字并取回的主要内容,如果未能解决你的问题,请参考以下文章

获取 3D numpy 数组中沿轴的连续非 nans 值总和的最大值

以矢量化方式连接给定开始,停止数字的范围数组 - NumPy

Numpy基础:数组和矢量计算

是否可以使用 python 将磁盘上的不连续数据映射到数组?

如何在numpy中创建一个连续数字数组?

NumPy基础-数组与向量化计算