넘파이(Numpy)와 N차원 배열 생성 두번째 시간입니다. 형식이 정해진 N차원 배열과 특정 범위의 값을 가지는 N차원 배열 생성을 함께 공부해보겠습니다.
np.zeros()
np.ones()
np.full()
np.eye()
np.zeros_like()
np.ones_like()
np.full_like()
np.arange()
np.linspace
np.logspace
#모든 요소들이 0으로 초기화된 N차원 배열 생성
arr = np.zeros((5, ), dtype=int)
print(arr)
>> [0 0 0 0 0]
arr2 = np.zero((2, 3), dtype=int)
print(arr2)
>> [[0 0 0]
[0 0 0]]
np.zeros() 함수는 모든 요소들이 0으로 초기화 된 N차원 배열을 생성합니다. 함수의 인자값으로는 shape이 들어가며, 예를 들어 (2, 3)이 인자로 들어갔을 때 2행 3열로 된 2차원 배열을 생성합니다.
#모든 요소들이 1로 초기화된 N차원 배열 생성
arr = np.ones((5, ), dtype=int)
print(arr)
>> [1 1 1 1 1]
arr2 = np.ones((2, 3), dtype=int)
print(arr2)
>> [[1 1 1]
[1 1 1]]
np.ones() 함수는 모든 요소들이 1로 초기화 된 N차원 배열을 생성합니다. 함수의 인자값으로는 shape이 들어가며, 예를 들어 (2, 3)이 인자로 들어갔을 때 2행 3열로 된 2차원 배열을 생성합니다.
#모든 요소들이 지정된 값으로 초기화된 N차원 배열 생성
arr = np.full((5, ), 9)
print(arr)
>> [9 9 9 9 9]
arr2 = np.full((2, 3), 9)
print(arr2)
>> [[9 9 9]
[9 9 9]]
np.full()함수를 이용하면 어떤 요소로 배열을 채울 것인지 정할 수 있습니다. np.full()함수의 인자로는 배열의 shape과 배열을 채울 요소가 들어갑니다. 당연히 정수 외의 값(문자열, 실수 등)으로도 배열을 채울 수 있습니다. 예를 들어 (2,3)과 9가 인자로 들어가면 2행 3열로 된 2차원 배열을 생성합니다.
np.eye()함수는 조금 독특합니다. 입력한 shape을 가진, 대각 원소가 1인 행렬을 생성합니다. shape은 NxN 또는 NxM을 값으로 가질 수 있습니다.
arr = np.eye(2, 3, k=1, dtype=int)
print(arr)
>> [[0 1 0]
[0 0 1]]
해당 소스코드는 (2, 3)의 shape을 가진 행렬의 대각 원소가 1임을 보여줍니다. k값이 1이므로 1행 2열을 기준으로 한 대각선에 1이 채워졌음을 알 수 있습니다.
arr = np.eye(3, dtype=int)
print(arr)
>> [[1 0 0]
[0 1 0]
[0 0 1]]
상단의 코드와 같이, np.eye함수의 인자로 정수 하나를 넣을 수도 있습니다. 그런 경우 입력한 정수 NxN의 정방 행렬을 생성하고, 대각원소에 1을 값으로 넣습니다.
인자로 배열을 받습니다. 모든 요소들이 0으로 초기화됩니다.
arr = np.array([[1, 2, 3],
[4, 5, 6]])
arr_z = np.zeros_like(arr)
print(arr_z)
>> [[0 0 0]
[0 0 0]]
인자로 배열을 받습니다. 모든 요소들이 1로 초기화됩니다.
arr = np.array([[1, 2, 3],
[4, 5, 6]])
arr_o = np.ones_like(arr)
print(arr_o)
>> [[1 1 1]
[1 1 1]]
np.full_like()함수의 인자로는 배열과, 지정된 값이 들어갑니다. 입력받은 배열의 모든 요소들이 입력된 값으로 초기화됩니다.
arr = np.array([[1, 2, 3],
[4, 5, 6]])
arr_f = np.full_like(arr, 99)
print(arr_f)
>> [[99 99 99]
[99 99 99]]
lst = list(range(0, 9, 2))
print(lst)
>> [0, 2, 4, 6, 8]
range()함수로 특정 범위의 값을 가지는 리스트를 만들 수 있는 것처럼, 넘파이의 np.arange()함수를 통해 특정 범위의 값을 가지는 N차원 배열을 만들 수 있습니다.
arr = np.arange(0, 9, 2)
print(arr)
>> [0 2 4 6 8]
파이썬의 range()함수를 활용하는 것과 동일하게, np.arange()함수의 인자로는 start, stop, step 값이 순서대로 들어갑니다. start값과 step값을 생략하고 stop값만 입력해도 0부터 stop전까지의 값을 가지는 배열을 만들 수 있습니다. 또한 step값을 생략하면 1씩 커지면서 배열을 생성합니다.
arr = np.arange(stop = 9, step = 2, start = 0)
print(arr)
>> [0 2 4 6 8]
다음과 같이 stop, step, start값을 지정해주면, 순서를 뒤집어도 같은 배열이 생성됩니다.
단, arange로 배열을 생성하면 stop 값 전까지의 값들로 배열을 만든다는 것을 기억해두어야 합니다.
np.linspace() 함수는 인자로 start, stop, num값을 받습니다. start는 배열의 시작값, stop은 배열의 끝 값이고, num은 start과 stop 사이를 몇개의 일정한 간격으로 배열을 만들지를 나타내는 값입니다. np.linspace()에서 stop값을 지정하면, stop값 까지 포함한 배열을 만듭니다. 이는 np.arange()와 다른 점입니다. 하지만 인자로 endspace=False를 포함시키면 stop값을 포함하지 않은 배열을 만들 수도 있습니다. 입력하지 않으면 endspace=True가 defualt입니다.
arr = np.linspace(0, 10, 11, dtype=int)
print(arr)
>> [0 1 2 3 4 5 6 7 8 9 10]
이미지를 통해 더 명확히 이해할 수 있습니다.
np.logspace() 함수는 인자로 start, stop, num값을 받고 base값을 추가로 입력해 줄 수 있습니다. logspace는 설정한 범위에서 로그로 분할한 위치의 값을 출력하며, base를 따로 입력해주지 않으면 상용로그가 기본 스케일이 됩니다.
arr = np.logspace(0, 5, 6, base=2, dtype=int)
print(arr)
>> [1 2 4 8 16 32]