Wil*_*ren 2 python performance numpy classification vectorization
我有一个包含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])
Run Code Online (Sandbox Code Playgroud)
但这不是很好的编码,需要花费很多时间.
知道如何对这种重新贴图进行矢量化吗?
为了清楚起见,我还希望能够将它们重新标记为旧值:
>>> 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])
Run Code Online (Sandbox Code Playgroud)
我们可以使用可选的参数return_inverse
用np.unique
得到这些独特的顺序ID /标签,像这样-
unq_arr, unq_tags = np.unique(old_classes,return_inverse=1)
Run Code Online (Sandbox Code Playgroud)
索引unq_arr
与unq_tags
检索回来-
old_classes_retrieved = unq_arr[unq_tags]
Run Code Online (Sandbox Code Playgroud)
样品运行 -
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])
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
196 次 |
最近记录: |