티스토리 뷰
Data structures¶
출처¶
https://github.com/JuliaComputing/JuliaBoxTutorials/tree/master/intro-to-julia (github : JuliaComputing/JuliaBoxTutorials/intro-to-julia)
Topics:
함께보기¶
- http://deepstat.tistory.com/45 (01. Getting started)(in English)
- http://deepstat.tistory.com/46 (01. Getting started(한글))
- http://deepstat.tistory.com/47 (02. Strings)(in English)
- http://deepstat.tistory.com/48 (02. Strings(한글))
- http://deepstat.tistory.com/49 (03. Data structures)(in English)
Tuples ¶
구성요소를 순서대로 적고 ( ) 로 감싸서 tuple 을 만들 수 있다.
구문:
(값1, 값2, ...)
좋아하는동물 = ("펭귄","고양이","다람쥐")
index를 이용해서 값을 가져올 수 있다.
좋아하는동물[1]
그러나 튜플은 변경 불가능 하기 때문에 업데이트가 안 된다.
좋아하는동물[1] = "수달"
NamedTuples¶
이름을 보고 생각한 것 처럼, NamedTuple은 구성요소에 이름이 있다는 점을 제외하면 Tuple이다. NamedTuple은 Tuple안에 =를 이용하는 구문을 가진다:
(이름1 = 값1, 이름2 = 값2, ...)
좋아하는동물 = (조류 = "펭귄", 포유류 = "고양이", 유대류 = "다람쥐")
보통의 Tuple 처럼, NamedTuple은 순서가 있어서 index를 이용해서 값을 가져올 수 있다:
좋아하는동물[1]
또한 이름을 이용해서 값을 불러올 수도 있다:
좋아하는동물.조류
아래처럼 쓰면 오류난다.
좋아하는동물["조류"]
이거는 된다.
좋아하는동물[:조류]
Dictionaries ¶
어떤 데이터가 서로서로 관련되어 있을 때, Dictionary를 써서 자료를 저장할 수도 있다. Dict() 를 써서 dictionary를 만들 수 있는데, 초기화 하려면 빈 dictionary를 만들거나 1개의 key, value 쌍을 이용하면 된다.
구문:
Dict(key1 => value1, key2 => value2, ...)
연락처 = Dict("영희" => "867-5309", "퇴마사" => "555-2368")
이 예시에서, 이름과 번호는 각각 key와 value 쌍이다. 영희의 전화번호를 끄집어 낼 때, 연관된 key를 이용하면 된다.
연락처["영희"]
아래와 같이 하면 이 dictionary에 다른 값도 추가할 수 있다.
연락처["철수"] = "555-달려"
연락처
pop! 을 이용해서 철수의 번호를 끄집어내면서 동시에 연락처에서 지울 수 있다.
pop!(연락처, "철수")
연락처
Tuple과 Array와는 다르게, dictionary는 순서가 없다. 그래서 index를 이용할 수 없다.
연락처[1]
위의 예시처럼, julia는 key 1과 연관된 값을 불러오려고 하는지 아닌지 판단할 수 없다.
참고로, 아래처럼 쓰면 오류난다.
연락처.영희
Arrays ¶
Tuple과는 다르게, Array는 변할 수 있다. Dictionary와는 다르게, Array는 순서가 있다. Array를 만드려면, [ ] 로 값을 감싸면 된다.
구문:
[값1, 값2, ...]
예를 들어, 친구 목록을 만들 수 있다.
친구목록 = ["균우", "상완", "동훈", "진", "재현"]
Array{String,1}에서 1이 의미하는 바는, 만들어진 Array가 1차원 벡터라는 것이다. Array{String,2}는 2차원 행렬, Array{String,3}은 3차원 tensor 같은 식이다. String은 값들의 형식이다.
Array에 수열을 저장할 수도 있다.
피보나치 = [1, 1, 2, 3, 5, 8, 13]
섞인거 = [1, 1, 2, 3, "Ted", "Robyn"]
Array는 Index를 이용해서 일부 값을 불러낼 수 있다.
친구목록[3]
Index를 이용해서 값을 덮어쓸 수도 있다.
친구목록[3] = "아기 새"
친구목록
Python의 Index는 0부터 시작하지만, Julia의 Index는 1부터 시작한다. (뒷 문장의 영어 해석은 0에서 시작할지 1에서 시작할지 의견이 분분하다느니의 얘기인데, 개발자의 고충을 알아달라는 것 같다.)
push!와 pop!을 이용해서 수정할 수 있다. push!를 이용하면 마지막 값을 추가할 수 있고, pop!을 이용하면 마지막 값을 제거할 수 있다.
예를 들면, 피보나치에 값을 하나 더 추가하거나 제거할 수 있다.
push!(피보나치, 21)
피보나치
pop!(피보나치)
피보나치
이때까지 scalar값의 1D array 만 고려했지만, Array는 모든 차원을 가질 수 있고, 다른 Array 또한 포함 할 수 있다.
예를 들어, 아래는 Array를 포함하는 Array이다.
좋아하는것 = [["꼬치", "초콜릿", "계란"],["폥귄", "고양이", "다람쥐"]]
숫자 = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
아래는 2D Array의 예이다.
좋아하는것 = [["꼬치", "초콜릿", "계란"] ["폥귄", "고양이", "다람쥐"]]
아래는 난수로 이루어진 2D 와 3D Array 의 예다.
rand(4, 3)
rand(4, 3, 2)
Array를 복사할 때는 항상 주의해야한다!
피보나치
수열 = 피보나치
수열[1] = 404
피보나치
수열을 수정했는데 피보나치도 수정됐다!
위의 예시에서 수열은 사실 피보나치의 복사본이 아니다. 그저 피보나치의 별칭을 만들어줬을 뿐이다.
피보나치의 복사본을 만들고 싶을 때는, copy 함수를 사용한다.
일단, 피보나치를 복구하자.
피보나치[1] = 1
피보나치
수열 = copy(피보나치)
수열[1] = 404
피보나치
마지막 결과에서, 피보나치는 수정되지 않았다. 수열과 피보나치가 전혀 별개의 변수가 되었음을 볼 수 있다.
연습문제 ¶
3.1¶
아래 코드를 사용해서 a_ray라는 Array를 만들자:
a_ray = [1, 2, 3]
4를 추가했다가 삭제해보자.
a_ray = [1, 2, 3]
push!(a_ray,4)
pop!(a_ray)
a_ray
@assert a_ray == [1, 2, 3]
?@assert
3.2¶
아래 코드를 이용해서 연락처에 "응급시" 라는 key와 string(119) 이라는 value를 추가하자.
연락처["응급시"] = 119
왜 오류가 날까?
연락처
연락처["응급시"] = 119
연락처["응급시"] = string(119)
3.3¶
아래 코드를 이용해서 유연한연락처라는 새로운 Dictionary를 만들자. 영희 전화번호는 정수로 저장하고 퇴마사 전화번호는 문자로 저장한다.
유연한연락처 = Dict("영희" => 8675309, "퇴마사" => "555-2368")
유연한연락처 = Dict("영희" => 8675309, "퇴마사" => "555-2368")
@assert 유연한연락처 == Dict("영희" => 8675309, "퇴마사" => "555-2368")
3.4¶
어떤 정수 값을 유연한연락처에는 넣을 수 있는데, 왜 연락처에는 못 넣을까? 그럼, 연락처를 어떻게 선언해야 정수값을 넣을 수 있게 될까?
유연한연락처["응급시"] = 911
유연한연락처
typeof(유연한연락처)
typeof(연락처)
연락처 = convert(Dict{Any,Any},연락처)
typeof(연락처)
연락처["응급시"] = 119
연락처
'Flux in Julia > Learning Julia (Intro_to_Julia)' 카테고리의 다른 글
04. Loops (한글) (0) | 2018.09.15 |
---|---|
04. Loops (0) | 2018.09.15 |
03. Data structures (0) | 2018.09.13 |
02. Strings (한글) (0) | 2018.09.12 |
02. Strings (0) | 2018.09.12 |