Chciałbym znaleźć elementy x
który zawiera "X"
i wymienić "X"
z "".
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 za pomocą for
pętla mogłabym:
for i=1:length(x)
x[i] = replace(x[i], "X", "")
end
Czy w ten sposób manipuluje się wektorami strunowymi w Julii? Czy jest tam .replace
lub apply
(sapply(x, replace, "X", "")
jak używany w R) zestaw funkcji, których powinienem używać?
Odpowiedzi:
1 dla odpowiedzi № 1Możesz to zrobić jak
[replace(i,"X","") for i in x]
Ale jako Stefan wskazane w komentarzach, tworzy nowy wektor. Prawidłowy sposób powinien być (jak wyjaśniono przez Matt)
x .= replace.(x, "X", "")
Aby krótko podsumować funkcję zastępowania, oto, co mówią oficjalne dokumenty Julii.
help?> replace
search: replace redisplay
replace(string, pat, r[, n])
Search for the given pattern pat, and replace each occurrence with r. If n is provided, replace at most n occurrences. As
with search, the second argument may be a single character, a vector or a set of characters, a string, or a regular
expression. If r is a function, each occurrence is replaced with r(s) where s is the matched substring. If pat is a
regular expression and r is a SubstitutionString, then capture group references in r are replaced with the corresponding
matched text.
julia>
2 dla odpowiedzi nr 2
Używanie do zapętlania lub rozumienia jest świetnerozwiązanie i zazwyczaj jest bardzo wydajnym rozwiązaniem. Pętle są szybkie w Julii, więc nie musisz się martwić o wektoryzację kodu, aby był szybki. To powiedziawszy, w nadchodzącym wydaniu 0.6 możesz napisać szybki wektoryzowany kod w Julii za pomocą nadawania kropkowego ponieważ ciągi są teraz traktowane jako elementy skalarne w emisji:
julia> replace.(x, "X", "")
100-element Array{String,1}:
"lod"
"kk"
"eco"
"jac"
⋮
"ojn"
"hmc"
"pb"
Możesz to zrobić w miejscu dzięki:
x .= replace.(x, "X", "")