4.1 내장함수 array()로 ndarray 생성

다차원 배열 생성 공장

4.1.1 내장함수 array()로 ndarray 생성

[수학적 의미: 무에서 유를 창조하는 공간 선언] 선형대수학에서는 어떤 연산을 시작하기 전, 스케치북에 “나는 가로 3칸, 세로 3칸짜리 2차원 공간을 쓰겠다”고 차원(Dimension)을 선언합니다.

numpy에서도 마찬가지로 가장 뼈대가 되는 배열 생성자 팩토리(Factory)를 가동해야 합니다.

ndarray 팩토리 애니메이션

[애니메이션] 느슨한 리스트 원자재를 압축하여 ndarray 장갑차로 생산해 내는 array() 엔진

[Numpy 강림: array() 엔진] 파이썬의 가장 원시적인 자료구조인 리스트(List) 재료를 array() 공장의 파이프에 밀어 넣으면, 내부적으로 메모리를 압축하여 막강한 ndarray 장갑차로 변환되어 나옵니다.

import numpy as np

a = np.array([1, 2, 3], dtype=int)
a

출력:

array([1, 2, 3])
type(a)

출력:

numpy.ndarray

ndarray 객체 ashape, ndim 등 여러 속성을 참조할 수 있다.

print(a.shape)
print(a.ndim)
print(a.dtype)
print(a.size)
print(a.itemsize)
print(a.nbytes)

출력 (예시):

(3,)
1
int32
3
4
12

속성

넘파이는 객체를 생성하고, 속성을 참조할 수 있다.

다음은 numpyndarray(다차원 배열)의 주요 속성을 설명한 표이다.

속성 설명
ndarray.shape 배열의 차원을 나타내는 튜플. 각 차원의 크기를 표현
ndarray.ndim 배열의 차원 수
ndarray.size 배열의 총 요소 수
ndarray.dtype 배열 요소의 데이터 형식
ndarray.itemsize 배열의 각 요소의 크기(바이트)
ndarray.nbytes 배열의 전체 크기(바이트)

함수 array()의 인자는 배열을 표현하는 리스트나 튜플 하나이며 다음처럼 수를 나열하면 오류가 발생한다.

import numpy as np
np.array(1, 2, 3)

오류:

TypeError: array() takes from 1 to 2 positional arguments but 3 were given

자료형

ndarray는 모든 원소(elements)가 단일한 자료형으로 구성된다.

그러므로 다음 코드처럼 하나라도 항목이 문자열이면 모든 항목이 동일하게 문자열 자료형인 <U32으로 지정된다.

np.array([1, 'py', 3.14])

출력:

array(['1', 'py', '3.14'], dtype='<U32')

numpy의 자료형은 데이터의 저장 방식과 크기를 지정하는 데 사용되며, 배열의 요소는 이러한 자료형 중 하나만을 가질 수 있다. numpy에서 배열의 빠른 계산 처리를 위한 방법이다.

[!NOTE] 문자열 자료형 <U32

<U32와 같은 자료형은 numpy에서 사용되는 유니코드 문자열 자료형을 나타낸다. 이 자료형은 길이가 32(32개의 문자를 포함할 수 있는)인 Unicode 문자열을 표현한다. 여기서 <는 Little-endian을 나타내고, U는 Unicode를, 32는 문자열의 최대 길이를 나타낸다. Little-endian은 숫자의 표현 방식 중 하나로, 숫자를 메모리에 저장할 때 가장 낮은 자릿수부터 저장하는 방식을 말한다.

import numpy as np
unicode_array = np.array(['가나다', '라마바', '사아자'], dtype='<U32')

unicode_array

출력:

array(['가나다', '라마바', '사아자'], dtype='<U32')

물론 dtype은 생략하거나 우리가 알고 있는 str을 적을 수 있다.

lang = np.array(['파이썬', '자바', ''])
lang

출력:

array(['파이썬', '자바', '씨'], dtype='<U3')
lang = np.array(['파이썬', '자바', ''], dtype=str)
lang

출력:

array(['파이썬', '자바', '씨'], dtype='<U3')

float

다음처럼 dtype=float로 명시하면 모든 항목 자료형이 float가 된다.

a = np.array((1, 2, 3), dtype=float)
a

출력:

array([1., 2., 3.])

다음처럼 dtype=float가 없더라도 배열 원소 중에 하나라도 float이면 자동으로 더 큰 범주인 floatdtype이 된다.

b = np.array((1, 2.5, 3))
b

출력:

array([1. , 2.5, 3. ])

내장함수 repeat()과 tile()을 활용한 배열 생성

동일한 숫자를 여러 번 반복해서 배열을 만들고 싶을 때는 수작업으로 입력하는 대신 np.repeat()np.tile() 함수를 사용하면 매우 편리합니다.

np.repeat() 함수

np.repeat() 함수는 배열의 각 개별 요소를 지정한 횟수만큼 반복하여 늘려줍니다.

np.repeat(a, repeats)

  • a: 반복할 입력 배열 또는 스칼라 값
  • repeats: 각 요소를 반복할 횟수
import numpy as np

# 4.2.1 단일 값 8을 4번 반복
print("단일 값 반복:", np.repeat(8, 4))
# 4.2.1 출력: [8 8 8 8]

# 4.2.1 배열 [1, 2, 4]를 통째로 2번씩 반복 (각 원소가 2번씩 연달아 나옴)
print("배열 원소 각각 반복:", np.repeat([1, 2, 4], 2))
# 4.2.1 출력: [1 1 2 2 4 4]

# 4.2.1 배열 요소마다 다르게 반복 횟수 지정 ([1은 1번, 2는 2번, 4는 3번])
print("각기 다른 횟수 반복:", np.repeat([1, 2, 4], repeats=[1, 2, 3]))
# 4.2.1 출력: [1 2 2 4 4 4]

np.tile() 함수

np.tile() 함수는 repeat()과 달리 패턴 단위로 묶어서(블록 전체를) 통째로 복사해서 이어 붙입니다. 타일(Tile)을 바닥에 깔아 나가는 방식을 생각하면 이해하기 쉽습니다.

np.tile(a, reps)

  • a: 반복할 패턴이 담긴 배열
  • reps: 전체 패턴을 반복 복사할 횟수
# 4.2.1 배열 [1, 2, 4] 패턴 전체를 통째로 2번 반복
repeated_whole = np.tile([1, 2, 4], 2)
print("패턴 전체를 타일처럼 두 번 이어붙이기:", repeated_whole)
# 4.2.1 출력: [1 2 4 1 2 4]
서브목차