2017-04-05 3 views
3

Ich möchte die Elemente von x, die "X" enthalten und ersetzen "X" mit "".Vector String ersetzen mit Julia

v = split("a b c d e f g h i j k l m n o p X") 
x = rand(v,100) .* rand(v,100) .* rand(v,100) 

A mit einer for Schleife ich konnte:

for i=1:length(x) 
    x[i] = replace(x[i], "X", "") 
    end 

Ist dies, wie String-Vektor-Manipulation in Julia getan wird? Oder gibt es eine .replace oder apply (sapply(x, replace, "X", "") wie in R verwendet) Satz von Funktionen, die ich verwenden sollte?

+1

Das ist ein guter Weg, es zu tun. Sie könnten 'map!' Verwenden, um es etwas prägnanter zu machen: 'map! (S-> ersetzen (s," X "," "), x, x)' – StefanKarpinski

+1

Beachten Sie, dass Bereiche auch für Zeichen funktionieren : ''a': 'z' 'ist ein gültiger Bereich und' string. (' a ':' z ') 'erzeugt einen Vektor von Strings. In Ihrem speziellen Fall müssen Sie wegen des 'X' einen zusätzlichen Schritt ausführen: 'v = string. (['A': 'p'; 'X'])' '. Jedenfalls finde ich es bequemer, als alle Buchstaben zu tippen. – DNF

Antwort

2

Sie können es wie

[replace(i,"X","") for i in x] 

Aber wie Stefan in den Kommentaren darauf hingewiesen, erstellt es einen neuen Vektor. Der richtige Weg (durch Matt wie erklärt)

x .= replace.(x, "X", "") 

Nur eine kurze Zusammenfassung zu haben, sollte Funktion ersetzen, hier ist das, was die Julia offizielle Dokumentation sagt.

+0

Das funktioniert, um einen neuen Vektor mit Ersetzung zu erzeugen, aber es wird den Vektor der Zeichenfolgen "x" nicht verändern. – StefanKarpinski

+0

Oh ja @StefanKarpinski. Vielen Dank –

3

Die Verwendung von For-Schleifen oder Comprehensions ist eine großartige Lösung und ist in der Regel eine sehr performante Lösung. Loops sind schnell in Julia, also müssen Sie sich keine Gedanken über die Vektorisierung von Code machen, nur um es schnell zu machen. Das heißt, in der kommenden 0.6 Release, Sie schnell vektorisiert Code in Julia using dot-broadcasting schreiben kann, da Strings jetzt als skalare Elemente in Broadcast behandelt werden:

julia> replace.(x, "X", "") 
100-element Array{String,1}: 
"lod" 
"kk" 
"eco" 
"jac" 
⋮ 
"ojn" 
"hmc" 
"pb" 

Sie können es an Ort und Stelle mit:

x .= replace.(x, "X", "")