ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] Numpy(넘파이) 내용 정리
    Python Data Analysis 2022. 11. 6. 12:32

    넘파이(Numpy)

    수많은 여러 가지 숫자들을 모두 하나의 변수에 넣고 처리하기 위한, 수치 해석용 파이썬 패키지이다. 일반 파이썬의 리스트보다 더 빠르고 메모리를 적게 먹는 배열을 사용한다. 이때 배열 사용을 위해 넘파이를 쓴다. 넘파이 배열의 조건은 다음과 같다.

     

    1. 모든 원소가 같은 자료형이어야 한다.

    2. 원소의 갯수를 바꿀 수 없다.

     

    넘파이는 다차원의 배열자료 구조인 ndarray 클래스를 지원하며, 벡터(배열)와 행렬(매트릭스)을 사용하는 선형대수 계산에서 주로 사용한다. 고성능 다차원 배열 객체를 처리하기 위한 여러 도구와 함수를 제공한다. ndarray는 같은 타입을 가진 값들의 grid이며, 양의 정수 튜플로 인덱싱 되어 있다. 

     

    * 선형대수학 : 행렬을 이용하여 선형적인 문제를 해결하는 수학 분야이자, 전기/전자/컴퓨터공학의 원리를 표현하는 핵심적인 이론이다. 단순히 행렬의 연산만을 다루는 것이 아니라, 공학적인 문제를 행렬의 형태로 정의하고 그 해답을 구하는 과정과 방법을 다루고 있다.

     

    * 분산 계산할 때, 파이썬에서는 모집단으로 여겨서 vari/len(arr)로 쓰고,
    R에서는 표본집단으로 보기 때문에 자유도를 써서 vari/(len(arr)-1) 로 쓴다.

     

    ['tom', 'james', 'oscar'] <class 'list'>

    ['tom' 'james' 'oscar'] <class 'numpy.ndarray'>

    넘파이 어레이는 컴마가 없다.

     

    일반 파이썬 리스트는 요소들이 각각의 객체이므로, 서로 다른 별도의 주소를 갖지만,

    넘파이 배열은 모든 요소들이 같은 주소를 갖는다.

     

     

    파이썬 리스트는 arr*10 를 하면 리스트가 10번이 쭉 반복된 리스트가 리턴되지만,

    넘파이 배열은 arr*10 하면 각 요소에 10이 곱해진다. (벡터화 연산)

     

    2차원 배열에서는 안쪽 리스트의 길이가 열의 갯수가 되고, 바깥쪽 리스트의 길이가 행의 갯수가 된다.

    c = np.array([[0, 1, 2], [3, 4, 5]])  # 2 x 3 array
    # 3열 2행

    n.ndim 배열의 차원

    shape 배열의 크기 (행, 열)

     

    배열 슬라이싱

    다차원 배열일 때는 각 자원을 축으로 구분한다.

    a[행, 열]

    -1 를 쓰면 '마지막'이라는 뜻이다.

    : 만 쓰면 '전체'라는 뜻이다.

    : 를 뒤에 붙이면 현재 인덱스부터 끝까지

    : 를 앞에 붙이면 현재 인덱스 전부터 처음까지

     

    배열 인덱싱

    인덱스 대신 True, False를 써서 해당 인덱스 위치의 요소만 골라낼 수도 있다.

    a %2==0 처럼 조건을 전달해서, 충족하는 요소만 골라낼 수 있다.

     

    array([[ 1,  2,  3,  4],
                [ 5,  6,  7,  8],
                [ 9, 10, 11, 12]])

    a[[2, 0, 1], :]

    array([[ 9, 10, 11, 12],

    [ 1,  2,  3,  4],

    [ 5,  6,  7,  8]])

    print(b[0], b[0][0], b[[0]]) #0번재 행, 0번쨰 행 0번쨰열 , 0번쨰 열 
    print(b[[0]].shape) # 따라서  길이는 1행 4열

     

    뒤에서부터 인덱스 셀때는 ... -3, -2, -1  이렇게 센다.

    c=np.copy(a) 는 주소를 치환해주는 게 아니고 , 값만 복사되어 새로운 객체가 생성된 것이기 때문에 수정해도 영향을 받지 않음

     

    a=

    [[ 1  2  3  4]

     [ 5  6  7  8]

     [ 9 10 11 12]]

    print(a[0], a[0][0], a[[0][0]], a[0,0], a[[0]])
    #[1 2 3 4] 1 [1 2 3 4] 1 [[1 2 3 4]]
    print(a[1], a[1][0], a[[1][0]], a[1,0], a[[1]])
    #[5 6 7 8] 5 [5 6 7 8] 5 [[5 6 7 8]]

    a 배열에서는 3번째 축이 존재하지 않는다.

     

    [[4 5 6]] (1, 3) -> 길이 1행 3열 

     

    c1=a[:,1] #[2 5 8] (3,)
    c2=a[:,1:2] 
    # [[2]
    #  [5]
    #  [8]] (3, 1)

     

    * (별연산) : 두 행렬이 같은 shape 일때 같은 자리의 요소끼리 곱셈이 되어 그 값으로 새로운 행렬을 출력한다.

    두 행렬의 사이즈가 맞지 않는다면, 작은 행렬을 큰 행렬의 모양에 맞게끔 늘려주는 '브로드캐스팅'을 한 다음, 연산을 해줄 수 있다.

    .dot(내적) : 첫번째 행렬의 열의 길이와 두번째 행렬의 행의 길이가 같아야 연산이 된다. 규칙에 맞게 곱해주고 더한 값으로 요소를 갖는 새로운 행렬을 출력한다.

    @(행렬곱) : 내적과 2차원 곱셈을 할 때까지는 동일하나, 3차원 곱셈을 할 때 달라진다.

     

     

     

     

     

     

     

     

    외부 참조 링크

     

    https://datascienceschool.net/01%20python/03.01%20%EB%84%98%ED%8C%8C%EC%9D%B4%20%EB%B0%B0%EC%97%B4.html

     

    3.1 넘파이 배열 — 데이터 사이언스 스쿨

    .ipynb .pdf to have style consistency -->

    datascienceschool.net

     

    댓글

Just do Justin