如何在F#的字符串数组中匹配子串并生成标签映射数组
嘿,刚上手F#和机器学习的话,这个需求其实很常见——给每个图片路径匹配对应的分类标签对吧?咱们来一步步实现你要的data_labels数组~
首先明确目标:我们需要从scan_data里的每个路径字符串中提取出它所属的标签(就是labels里的"cat"、"dog"、"horse"),最终生成一个和scan_data长度完全一致的标签数组。
方法1:直接分割路径字符串(简单直接)
利用F#的字符串分割功能,把每个路径按反斜杠\拆分,取第一部分就是我们要的标签:
let labels = [|"cat"; "dog"; "horse"|] let scan_data = [|"cat\\1.jpg"; "cat\\2.jpg"; "dog\\1.jpg"; "dog\\2.jpg"; "dog\\3.jpg"; "horse\\1.jpg"; "horse\\2.jpg"; "horse\\3.jpg"; "horse\\4.jpg"; "horse\\5.jpg"|] // 生成目标数组data_labels let data_labels = scan_data |> Array.map (fun imagePath -> // 按反斜杠分割路径,取第一个元素作为标签 imagePath.Split('\\').[0])
运行这段代码后,data_labels的结果就是:[|"cat"; "cat"; "dog"; "dog"; "dog"; "horse"; "horse"; "horse"; "horse"; "horse"|]
完全符合你的需求~
方法2:用System.IO.Path处理(更通用)
如果以后你的路径格式变复杂(比如多层目录),用.NET的System.IO.Path类来处理会更稳健,不用手动处理分割符:
open System.IO let labels = [|"cat"; "dog"; "horse"|] let scan_data = [|"cat\\1.jpg"; "cat\\2.jpg"; "dog\\1.jpg"; "dog\\2.jpg"; "dog\\3.jpg"; "horse\\1.jpg"; "horse\\2.jpg"; "horse\\3.jpg"; "horse\\4.jpg"; "horse\\5.jpg"|] let data_labels = scan_data |> Array.map (fun imagePath -> // 先获取路径的目录部分,再取目录的名称 Path.GetFileName(Path.GetDirectoryName(imagePath)))
这个方法的好处是跨平台兼容(自动处理Windows和Linux的路径分隔符),即使路径变成"animals/cat/1.jpg"也能正确提取标签。
可选:添加标签合法性验证
如果担心scan_data里出现不在labels中的无效标签,可以加个校验逻辑,避免后续机器学习训练出问题:
let data_labels = scan_data |> Array.map (fun imagePath -> let label = imagePath.Split('\\').[0] // 检查提取的标签是否在给定的labels数组中 if Array.contains label labels then label else // 如果无效就抛出错误,方便调试 failwithf "发现未知标签:%s,对应路径:%s" label imagePath)
这样一旦有错误路径,程序会立刻提示你,避免后续埋坑~
内容的提问来源于stack exchange,提问作者sanjog47
相关产品推荐
相关产品推荐

