在Julia中删除矩阵首属性值小于4的行
Julia矩阵筛选:保留首属性值为4的行
你需要从1521×4的矩阵中删除首属性值小于4的行,本质是保留首属性值等于4的行,Julia里可以通过布尔索引轻松实现,下面结合你的现有代码给出完整方案:
优化现有代码+实现筛选
你的现有代码在初始化dataset时多了一行全0的初始行,最后需要去掉,同时可以用更高效的方式收集数据,再进行筛选:
using DelimitedFiles # 删除空文件 files_and_dirs = readdir() for f in files_and_dirs if filesize(f) == 0 rm(f) end end # 收集目标文件 target_files = filter(endswith(".lxyr"), files_and_dirs) # 初始化数据集(避免初始的全0行) dataset = Matrix{Float64}(undef, 0, 4) # 读取文件并合并 for count in 1:134 name = "img"*string(count)*".lxyr" if isfile(name) matrix = readdlm(name) dataset = vcat(dataset, matrix) end end # 核心:筛选首属性值等于4的行(因取值范围是0-4,等价于排除小于4的行) filtered_dataset = dataset[dataset[:, 1] .== 4, :]
代码解释
dataset[:, 1]:提取矩阵的第一列(首属性列).== 4:对第一列的每个元素做相等判断,返回一个布尔数组(元素为true表示对应行的首属性值符合要求)dataset[布尔数组, :]:用布尔数组作为行索引,只保留对应位置为true的行,:表示保留所有列
额外性能优化建议
如果文件数量较多,反复调用vcat会导致性能损耗,可以先把每个文件的矩阵存入列表,再一次性合并:
# 改用列表存储每个文件的矩阵 data_list = [] for count in 1:134 name = "img"*string(count)*".lxyr" if isfile(name) push!(data_list, readdlm(name)) end end # 一次性合并所有矩阵 dataset = vcat(data_list...)
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

