내용
배열 객체의 자료형
자료형 (data type)은 입력된 데이터를 위한 메모리의 크기를 확정하기 위한 것입니다. 그러므로 데이터 형(data type)을 명시하지 않은 상태에서 여러 유형이 혼재된 경우 일반적으로 큰 메모리가 소비되는 형태로 자동 지정되지만 경우에 따라서는 메모리 과부하 상태로 인해 자료의 손실이 발생할 수 있습니다. 그러므로 다양한 자료형이 혼재된 경우 명시적으로 데이터 타입을 지정하는 것이 안전합니다.
np.array()
함수를 사용하여 배열 객체를 생성할 경우 dtype에 인수를 전달함으로서 배열의 데이터형을 지정할 수 있습니다. 그러나 이 값을 지정하지 않을 경우 그 데이터형은 자동으로 지정되는데 일반적으로 numpy 배열의 기본 데이터 형은 실수형(np.float64)입니다. 이것은 정수형과 실수형이 혼합되어 있을 경우 실수형으로 인식된다는 의미입니다.
x=np.ones(1) x
array([1.])
x.dtype
dtype('float64')
위 속성 dtype은 객체의 데이터 형을 반환하지만 역으로 그 속성을 사용하여 객체의 데이터 형을 지정할 수 있습니다. 예를 들어 다음 객체 x는 실수(부동소수)로 입력하였지만 객체에 int 32를 지정하여 정수형으로 변환할 수 있습니다.
x=np.ones(1, dtype=np.int32) x
array([1], dtype=int32)
x.dtype
dtype('int32')
다음 표는 numpy 배열에서 사용할 수 있는 자료형의 종류입니다.
구분 | type(code) | 예 | |
---|---|---|---|
숫자형 | boolean | bool(b) | [True, False] |
정수형 | int8(i1) | [-2, 0, 1,2] | |
int16(i2) | |||
int32(i4) | |||
int64(i8) | |||
unsigned 정수형 |
uint8(u1) | [2, 0, 1,2] | |
uint16(u2) | |||
uint32(u4) | |||
unt64(u8) | |||
부동소수형 | float16(f2) | [-2.0, 0.0, 1.0,2.0] | |
float32(f4) | |||
float64(f8) | |||
복소수형 | complex64(c8) | (1+2j) | |
complex128(c16) | |||
문자형 | 문자형 | string(S) | ['book','computer', '2', 'a'] |
다음은 문자열(string)으로 구성된 배열의 자료형입니다.
y=np.array(['a', 'computer']) y.dtype
dtype('<U8')
y1=np.array(['1']) y1.dtype
dtype('<U1')
위의 결과중 '<U8'는 유니코드 문자열(Unicode string)로서 최대 문자열의 길이가 8가 미만이라는 것을 의미합니다. 이와같은 자료형의 축약코드는 다음 표와 같습니다.
코드 | 의미 |
---|---|
'b' | boolean |
'i' | (signed) integer |
'u' | unsigned integer |
'f' | floating-point |
'c' | complex-floating point |
'm' | timedelta |
'M' | timedelta |
'O' | (Python) objects |
'S', 'a' | (Python) objects |
'O' | zero-terminated bytes (not recommended) |
'U' | Unicode string |
'V' | raw data (void) |
객체 y1은 숫자형으로 전환될 수 있는 문자형입니다. 형변환은 astype()
메서드를 사용합니다.
y2=y1.astype(np.int64) y2
array([1])
y2.dtype
dtype('int64')
np.dtype.kind
속성을 사용하여 객체의 자료형을 나타낼 수 있습니다.
x=np.array([0b1010]) x.dtype.kind
'i'
from numpy import random x=np.random.rand(3) x
array([0.98534827, 0.59160359, 0.14627715])
x.dtype dtype('float64') x.dtype.kind
'f'
y=np.array([True, False]) y.dtype
dtype('bool')
y.dtype.kind
'b'
배열의 분할
하나의 배열을 여러개로 분할하기 위해서는 인덱싱을 사용할 수 있습니다. 대신에 split, hsplit, vsplit, dsplit
등의 함수를 사용할 수 있습니다.
- np.split(배열, 인덱스 또는 정수, axis=0)
- 배열은 지정한 기준 (인덱스, 또는 정수)에 따라 분할
- 예로 3(정수): 배열을 지정한 축에 따라 균할 3 등분
- [2, 4]의 경우 지정한 축이 axis=0이라면 [:2, :], [2:4,:], [4:,:]와 같이 분할
- axis에 정수 값을 전달하여 축을 지정할 수 있음.
- .shape의 결과 왼쪽부터 0, 1,...
- 배열은 지정한 기준 (인덱스, 또는 정수)에 따라 분할
a = np.arange(10) print(a)
[0 1 2 3 4 5 6 7 8 9]
분할하는 갯수를 인수로 지정함으로서 균등한 요소 갯수들을 가진 부분들로 분할
print(np.split(a, 5))
[array([0, 1]), array([2, 3]), array([4, 5]), array([6, 7]), array([8, 9])]
객체의 분할 지점으로 인덱스를 지정할 수 있습니다.
print(np.split(a, [2, 6, 7,9]))
[array([0, 1]), array([2, 3, 4, 5]), array([6]), array([7, 8]), array([9])]
위 코드의 [2, 6, 7,9]은 a[:2], a[2:6], a[6:7], a[7:9], a[9:]를 의미합니다.
b=np.random.randint(10, size=(2,3)) print(b, b.shape)
[[9 7 4] [9 6 4]] (2, 3)
위 코드의 axis=0이므로 행 기준으로 2등분
np.split(b, 2)
[array([[9, 7, 4]]), array([[9, 6, 4]])]
다음 코드의 axis=1이므로 열 기준으로 3등분. 다음 코드는 좀더 복잡한 모양의 배열의 분할입니다.
np.split(b, 3, axis=1)
[array([[9], [9]]), array([[7], [6]]), array([[4], [4]])]
c=np.random.randint(10, size=(4,6)) print(c, c.shape)
[[5 4 5 6 0 0] [3 2 0 2 1 3] [7 0 0 1 5 0] [5 1 1 3 4 6]] (4, 6)
np.split(c, [2,3])
[array([[5, 4, 5, 6, 0, 0], [3, 2, 0, 2, 1, 3]]), array([[7, 0, 0, 1, 5, 0]]), array([[5, 1, 1, 3, 4, 6]])]
np.split(c, [2,3], axis=1)
[array([[5, 4], [3, 2], [7, 0], [5, 1]]), array([[5], [0], [0], [1]]), array([[6, 0, 0], [2, 1, 3], [1, 5, 0], [3, 4, 6]])]
위의 split()
함수와 유사하지만 분할되는 축이 지정된 함수들을 사용할 수 있습니다.
- np.hsplit(배열, 인덱스 또는 정수)
- 배열의 모양 중 두번째 축을 기준으로 분할, .shape(첫번째축, 두번째축, ...)
- 2차원 이상의 다차원 배열의 경우 역시 두번째 축이 분할의 기준이 됨
- 다른 인자는 split()과 같음
- np.vsplit(배열, 인덱스 또는 정수)
- 배열의 모양 중 첫번째 축을 기준으로 분할, .shape(첫번째축, 두번째축, ...)
- 2차원 이상의 다차원 배열의 경우 역시 첫번째 축이 분할의 기준이 됨
- 다른 인자는 split()과 같음
a = np.arange(16).reshape(4,4) print(a)
[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]]
print(np.hsplit(a, 2))
[array([[ 0, 1], [ 4, 5], [ 8, 9], [12, 13]]), array([[ 2, 3], [ 6, 7], [10, 11], [14, 15]])]
print(np.hsplit(a, [2, 3]))
[array([[ 0, 1], [ 4, 5], [ 8, 9], [ 6], [10], [14]]), array([[ 3], [ 7], [11], [15]])]
b=np.random.randint(10, size=(2,4,2))#(2,4,2)=(2,2,2)+(2,2,2) print(b, b.shape)
[[[3 7] [9 9] [0 2] [3 9]] [[1 2] [6 5] [3 5] [1 0]]] (2, 4, 2)
np.hsplit(b, 2)
[array([[[3, 7], [9, 9]], [[1, 2], [6, 5]]]), array([[[0, 2], [3, 9]], [[3, 5], [1, 0]]])]
a = np.arange(16).reshape(4,4) print(a)
[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]]
print(np.vsplit(a, 2))
[array([[0, 1, 2, 3], [4, 5, 6, 7]]), array([[ 8, 9, 10, 11], [12, 13, 14, 15]])]
print(np.vsplit(a, [2, 3]))
[array([[0, 1, 2, 3], [4, 5, 6, 7]]), array([[ 8, 9, 10, 11]]), array([[12, 13, 14, 15]])]
b=np.random.randint(10, size=(2,4,2))#(2,4,2)=(1,4,2)+(1,4,2) print(b, b.shape)
[[[3 7] [9 9] [0 2] [3 9]] [[1 2] [6 5] [3 5] [1 0]]] (2, 4, 2)
np.vsplit(b, 2)
[array([[[3, 7], [9, 9], [0, 2], [3, 9]]]), array([[[1, 2], [6, 5], [3, 5], [1, 0]]])]
댓글
댓글 쓰기