广播范围

问题描述

我的数据框中有一个数组数组-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退回不需要的部分首先分裂。

因此,您可能想利用splitlimit关键字参数,这样一来您就不会拆分太多单词:

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非常熟悉。然后我个人更喜欢上一个。)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...