본문 바로가기
Computer Science/[20-4] Numpy 연습

[Numpy] (2) Transpose and Flatten, flatten()과 ravel()의 차이점

by gojw 2020. 3. 30.

HackerRank 문제: https://www.hackerrank.com/challenges/np-transpose-and-flatten/problem

 

Transpose and Flatten | HackerRank

Use the transpose and flatten tools in the NumPy module to manipulate an array.

www.hackerrank.com

input:

2 2

1 2

3 4

output:

[[1 3]

[2 4]]

[1 2 3 4]

import numpy as np

first = input().split(' ')
rows, columns = int(first[0]), int(first[1])

data = []
for _ in range(rows):
    next = input().split(' ')
    data.append([int(x) for x in next])

# list를 numpy array로 바꿔준다.
result = np.array(data)
print(result.transpose())
print(result.flatten())

 

numpy.transpose(self, axes=None) 는 배열의 transpositon을 리턴한다.

 

numpy.flatten(order='C') 는 다차원 배열을 1차원 배열로 변환해서 리턴한다.

order parameter은 default 값이 C이다.

'C' = row-major order로 flatten한다. : row 먼저

'F' = column-major order로 flatten한다. : column 먼저

'K' = 메모리에 발생하는 순서대로 flatten한다.

 

 numpy.ravel()과의 차이점?

  (1) flatten은 메모리를 차지하기 때문에 ravel보다 느리다.

  (2) ravel()은 일차원으로 바뀐 뷰를 리턴하고, flatten()은 일차원으로 바뀐 복사본을 리턴한다.

 

예시)

# 뷰를 리턴하는 ravel()
>>> array2 = np.array([[1, 2], [3, 4]])
>>> print(array2)
>>> array3 = array2.ravel()
>>> print(array3)
>>> array3[0] = 1000
>>> print(array3)
>>> print(array2)
# [[1 2]
#  [3 4]]
# [1 2 3 4]
# [1000    2    3    4]
# [[1000    2]
#  [   3    4]]

# 복사본을 리턴하는 flatten()
>>> array2 = np.array([[1, 2], [3, 4]])
>>> print(array2)
>>> array3 = array2.flatten()
>>> print(array3)
>>> array3[0] = 1000
>>> print(array3)
>>> print(array2)
# [[1 2]
#  [3 4]]
# [1 2 3 4]
# [1000    2    3    4]
# [[1 2]
#  [3 4]]

→ 맨 마지막에 원본 배열 array2를 출력했을 때 revel()은 값이 바뀌어져있고, flatten()은 값이 변하지 않았음을 확인할 수 있다. flatten()은 복사본이기 때문에 flatten()을 이용해서 새로 만든 객체 array3을 변경해도 원본에 영향을 주지 않는다. 그러나 ravel()은 원본 배열의 뷰를 리턴해서, 변경하면 원본에 영향을 준다. 

→ 차이점 (1)의 이유도 여기서 찾을 수 있다. flatten()은 복사본을 저장해서 메모리를 차지한다. 그러나 ravel()은 메모리를 차지하지 않아서 더 빠르다.

 

연습)

>>> array1 = np.array([[1, 2], [3, 4]])

>>> print(array1.flatten())
>>> print(array1.flatten('F'))
>>> print(array1.flatten('A'))
>>> print(array1.flatten('K'))

# [1 2 3 4]
# [1 3 2 4]
# [1 2 3 4]
# [1 2 3 4]

댓글