Index Array senza elementi

Oct 10 2020

Ho un vettore

a = Vector(1:4)

[1, 2, 3, 4]

e voglio indicizzarlo su tutti gli elementi tranne il terzo per ottenere

[1, 2, 4]

in Rche si possa fare a[-3]. Cosa fai Julia?

(Alla fine voglio scorrere tutti gli elementi e confrontare ciascuno di essi con il resto - forse questo è rilevante.)

Risposte

6 PrzemyslawSzufel Oct 10 2020 at 13:23

La sintassi Julia sarà purtroppo più prolissa di quelle di R:

julia> a[1:end .!== 3]
3-element Array{Int64,1}:
 1
 2
 4

Un'altra opzione è modificare un:

julia> deleteat!(a,3)
3-element Array{Int64,1}:
 1
 2
 4

Se i tuoi dati sono all'interno di un di DataFramequanto puoi ottenere una sintassi migliore:

julia> df = DataFrame(a=1:4);

julia> df[Not(3),:]
3×1 DataFrame
│ Row │ a     │
│     │ Int64 │
├─────┼───────┤
│ 1   │ 1     │
│ 2   │ 2     │
│ 3   │ 4     │

e quando DataFramesviene importato Notfunzionerà anche con Vector:

julia> a[Not(3)]
3-element Array{Int64,1}:
 1
 2
 4
7 BogumiłKamiński Oct 10 2020 at 13:26

Questo caso d'uso è comune ed è coperto dal pacchetto InvertedIndices.jl . Se lo installi, puoi eseguire:

julia> using InvertedIndices

julia> a = 1:4
1:4

julia> a[Not(3)]
3-element Array{Int64,1}:
 1
 2
 4

Anche alcuni pacchetti (come DataFrames.jl) caricano automaticamente questo pacchetto (quindi se ad esempio usi DataFrames.jl non devi installare e caricare InvertedIndices.jl separatamente).

BenoitPasquier Oct 14 2020 at 04:40

Non ho visto

julia> a[1:end .≠ 3]
3-element Array{Int64,1}:
 1
 2
 4

o

julia> a[eachindex(a) .≠ 3]
3-element Array{Int64,1}:
 1
 2
 4

accennato, ma forse c'è un buon motivo?


EDIT : mi sbagliavo, il primo è in realtà lo stesso della prima risposta di Bogumil tranne che !==è stato sostituito con≠