如何解决广播范围
我的数据框中有一个数组数组-split.(df2.name)
:
> 392-element Array{Array{SubString{String},1},1}:
["chevrolet","chevelle","malibu"]
["buick","skylark","320"]
["plymouth","satellite"]
["amc","rebel","sst"]
["ford","torino"]
⋮
["ford","mustang","gl"]
["vw","pickup"]
["dodge","rampage"]
["ford","ranger"]
["chevy","s-10"]
我想选择每个数组中除第一个元素之外的所有元素,并将它们连接在一起,以获得这些汽车的型号名称。
首先,我想做这样的事情:model = join.(split.(df2.name)[2:end]," ")
,但不是删除每个数组的第一个元素,而是删除了第一个汽车(外部数组的第一个元素)。
因此,我想通过在范围[2:end]
之前放置一个点来向所有元素广播范围model = join.(split.(df2.name).[2:end]," ")
。但这似乎也不起作用,因为存在语法错误:
Syntax: missing last argument in "2:" range expression
在这种情况下,朱利安广播范围的方式是什么?
解决方法
在这里使用纯广播似乎有点棘手,因为如您所知,建立2:end
范围会明显导致语法错误。我认为这是因为像
a[2:end]
经过专门分析,并降低到类似
a[2:lastindex(a)]
如lastindex
文档中所述。
不过,您可以使用Iterators.drop
之类的迭代器来迭代除第一个元素(可以广播的操作)之外的所有元素:
julia> cars = [["chevrolet","chevelle","malibu"],["buick","skylark","320"],["plymouth","satellite"],["amc","rebel","sst"],["ford","torino"]];
julia> join.(Iterators.drop.(cars,1)," ")
5-element Array{String,1}:
"chevelle malibu"
"skylark 320"
"satellite"
"rebel sst"
"torino"
但是我认为在这种情况下,我可能会去理解,我认为这会更具可读性:
julia> [join(car[2:end]," ") for car in cars]
5-element Array{String,1}:
"chevelle malibu"
"skylark 320"
"satellite"
"rebel sst"
"torino"
编辑:回顾您的全局问题,看起来您比需要的人先split
,然后苦苦地join
退回不需要的部分首先分裂。
因此,您可能想利用split
的limit
关键字参数,这样一来您就不会拆分太多单词:
julia> cars2 = ["chevrolet chevelle malibu","buick skylark 320","plymouth satellite","amc rebel sst","ford torino"];
julia> split.(cars2," ",limit=2)
5-element Array{Array{SubString{String},1},1}:
["chevrolet","chevelle malibu"]
["buick","skylark 320"]
["plymouth","satellite"]
["amc","rebel sst"]
["ford","torino"]
julia> getindex.(split.(cars2,limit=2),2)
5-element Array{SubString{String},1}:
"chevelle malibu"
"skylark 320"
"satellite"
"rebel sst"
"torino"
最后一个示例还演示了如何通过显式getindex(a,i)
函数调用广播索引语法,这是语法糖a[i]
的简化形式。
通常,广播索引语法通过将其转换为getindex
并广播以下内容来起作用:
model = join.(getindex.(split.(df2.name),Ref(2:10))," ")
Ref
需要将范围视为标量;您也可以改用1元组。
那是容易的部分。但是,与end
一起使用时,此技巧变得很丑陋,因为它在方括号之外没有任何意义,这是导致您出错的原因。解决此问题的一种方法是将end
替换为lastindex
,但是您可能应该缓存数组计算:
model = let nameparts = split.(df2.name)
join.(getindex.(nameparts,Ref(2:lastindex(nameparts)))," ")
end
但是,这失去了广播融合的优势。
在这种特定情况下,您也可以使用Iterators.rest
,因为我们知道Array
迭代器的工作原理:
join.(Iterators.rest.(split.(df2.name),2)," ")
但是我认为最简单的版本只是一种理解:
model = [join(split(carname)[2:end]) for carname in df2.name]
(除非您对Iterators
非常熟悉。然后我个人更喜欢上一个。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。