首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >广播范围

广播范围
EN

Stack Overflow用户
提问于 2020-08-23 12:27:35
回答 2查看 55关注 0票数 3

我的dataframe - split.(df2.name)中有一个数组。

代码语言:javascript
复制
> 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], " "),但不是删除每个数组的第一个元素,而是删除第一个car (外部数组的第一个元素)。

所以我想把范围[2:end]广播给所有的元素,方法是在距离前点:model = join.(split.(df2.name).[2:end], " ")。但这似乎也不起作用,因为存在语法错误:

代码语言:javascript
复制
syntax: missing last argument in "2:" range expression

那么,在这种情况下,朱利安用什么方式来广播一个范围呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-23 13:36:11

在这里使用普通广播似乎有点棘手,因为正如您所发现的,构建2:end范围会显式地导致语法错误。我认为这是因为这样的表达方式

代码语言:javascript
复制
a[2:end]

被特别分析并降低到

代码语言:javascript
复制
a[2:lastindex(a)]

正如lastindex文档中所解释的那样。

但是,您可以使用像Iterators.drop这样的迭代器来遍历除第一个元素之外的所有元素,这是一个可以广播的操作:

代码语言:javascript
复制
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"

但我认为,在这种情况下,我可能会进行理解,我认为这将是更易读的:

代码语言:javascript
复制
julia> [join(car[2:end], " ") for car in cars]
5-element Array{String,1}:
 "chevelle malibu"
 "skylark 320"
 "satellite"
 "rebel sst"
 "torino"

编辑:回顾了您的全球问题,它似乎您首先比您想要的split更多,然后挣扎join返回您最初不想分裂的部分。

因此,您可能希望利用limit关键字参数到split,这样您就不会首先拆分太多的单词:

代码语言:javascript
复制
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]的降低形式。

票数 2
EN

Stack Overflow用户

发布于 2020-08-23 13:33:10

通常,广播索引语法的工作方式是将其转换为getindex并广播如下:

代码语言:javascript
复制
model = join.(getindex.(split.(df2.name), Ref(2:10)), " ")

需要Ref将范围作为标量来处理;您也可以使用一个1元组。

这是最简单的部分。但是,这个技巧在end中的使用变得很难看,因为在括号外它没有任何意义,这是您得到错误的原因。解决此问题的一种方法是将end替换为lastindex,但是您可能应该缓存数组计算:

代码语言:javascript
复制
model = let nameparts = split.(df2.name)
    join.(getindex.(nameparts, Ref(2:lastindex(nameparts))), " ")
end

然而,这就失去了广播融合的优势。

在这种特殊情况下,您也可以使用Iterators.rest,因为我们知道Array迭代器是如何工作的:

代码语言:javascript
复制
join.(Iterators.rest.(split.(df2.name), 2), " ")

但在我看来,最简单的版本只是一种理解:

代码语言:javascript
复制
model = [join(split(carname)[2:end]) for carname in df2.name]

(除非你对Iterators非常熟悉。那么我个人更喜欢上一个。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63546933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档