Numpy array 생성 - Numpy array saengseong

할 수 있습니다.  예전에 250만개 row를 가진 DataFrame에 대해서 데이터 전처리하면서 loop 함수를 썼더니 4시간이 지나도 끝나지가 않던것을요, NumPy 함수를 썼더니 단 몇 분만에 끝나서 깜짝 놀란 적이 있습니다. (다르게 얘기하면, Python에서 Loop 돌리는게 속도, 성능에는 아주 안좋습니다. 대용량 데이터에 Loop 쓸 때는 성능 이슈 고려하시길... Loop 안쓰고 NumPy 함수로 대신할 수 있는지 꼭 확인해보세요.)

비교연산자와 bool연산으로도 구현가능하지만, 조건을 만족하는 경우와 그렇지 않은 경우 둘다 값을 바꾸려고 하는 경우에는 where을 쓰는것이 더 간결한 경우가 많다. 또, bool 배열을 이용한 인덱싱은 원본 배열의 값을 바꾸지만, where은 원본 배열의 값이 변하지 않는다.

numpy 배열값의 상한, 하한 값 정하기 clip(), minimum(), maximum()

어떤 배열에서 상한값, 하한값을 정하고 싶을 경우가 있다. 최대값, 최솟값을 제한하고 싶다면 clip()을 써주면 된다. clip()에서 지정한 최소값보다 작은 값은 지정한 값으로 바뀌며, clip()에서 지정한 최대값보다 큰 값도 지정한 값으로 바뀐다. clip은 원본 배열의 값을 바꾸지 않는다.

np.array([1,3,5,7,9])
40
np.array([1,3,5,7,9])
41

minimum(), maximum()을 사용할 수도 있다. minmum()은 둘중 작은값, maximum()은 둘중 큰값을 반환한다.

np.array([1,3,5,7,9])
42
np.array([1,3,5,7,9])
43numpy배열에서 중복이 제거된 값 불러오기 unique()

배열내에 어떤 값들이 존재하지 알고싶은 경우가 있다. 이때, 중복되는 값들이 많다면 어떤 값들이 존재하는지 파악하기 힘들 것이다. unique()를 이용하면 배열에서 중복이 제거된 값들을 볼 수 있다.

np.array([1,3,5,7,9])
44
np.array([1,3,5,7,9])
45

return_counts 옵션을 True로 주는 경우, 어떤 값이 몇개가 들어있어쓴지를 알 수 있게 된다.

np.array([1,3,5,7,9])
46
np.array([1,3,5,7,9])
47

return_reverse를 True로 주는경우 원본 배열을 만들 수 있는 배열을 같이 반환한다. 기존에 반환하는 unique한 배열을 같이 반환된 배열로 접근을 하면 원본 배열을 다시 만들 수 있다.

np.array([1,3,5,7,9])
48
np.array([1,3,5,7,9])
49

연산이 진행될 축을 지정할 수 있다. 이 경우에 행이나 열 내부에서 연산이 이루어지는 것이 아니다. 연산이 이루어지는 방향으로 행이나 열 자체에 대해 연산이 이루어지게 된다. 즉, 행이나 열이 동일한지 아닌지를 판별하게 된다.

리스트를 활용해 배열을 만들 수 있다. 이 외에, array() 함수의 인자로 리스트, 튜플, ndarray, mat와 같은 array-like 객체들을 전달해 배열을 만들 수도 있다.

import numpy as np
a = np,array([1, 4, 2, 5, 3])
b = np.array([3.14, 4, 2, 3])
c = np.array([1, 2, 3, 4], dtype=float)
d = np.array([4, 2, 3, 3.14])
print(a, b, c, d)
Numpy array 생성 - Numpy array saengseong
a # array([1, 4, 2, 5, 3]) → int
b # array([3.14, 4.  , 2.  , 3.  ]) → float
c # array([1., 2., 3., 4.]) → float
d # array([4.  , 2.  , 3.  , 3.14]) → float

np.array()로 만들어진 ndarray 객체들은 array()로 표현된다. ndarray는 같은 자료형만으로 구성되므로, b나 c처럼 float와 int가 같이 들어오게 된다면 해당 ndarray의 객체의 자료형은 보다 큰 자료형인 float로 정의된다.

★ 주의
np.array의 함수의 인자로 스칼라 형태의 값을 전달해줄 수 있다. 이때, ndarray는 0차원이되며, 모양은 (), 크기는 1이 된다. 해당 스칼라를 리스트의 형태로 값을 전달해줄 경우, ndarray는 1차원이되며, 모양은 (1, ), 크기는 1이 된다. 즉 단순히 스칼라를 인자로 전달하는 것과, 리스트로 인자를 전달하는 것은 엄격히 구별되어야 한다.

# array에서는 스칼라를 전달할 수도 있다.
e = np.array(10)
e # array(10)

# 이때, 배열은 0차 배열이 된다. 이 배열의 차원과 모양, 크기는 다음과 같다.
e.ndim # 0
e.shape # ()
e.size # 1

# 1차 배열을 생성하려면 다음과 같이 리스트, 혹은 튜플의 형태로 넘겨야 한다.
e = np.array([10])
e # array([10])

e.ndim # 1
e.shape # (1,)
e.size # 1

 


특정 수로 채워진 배열 만들기 : zeros(), ones(), full()

1. np.zeros(shape) : shape의 모양을 가지면서 0으로 채워진 ndarray 생성

# shape가 int일 경우 벡터(배열), tuple일 경우 배열이 된다.
a = np.zeros(10, dtype = int) # 0으로 채워진 크기가 10인 벡터
a = np.zeros((10, 2), dtype = float) 
# 0. 으로 채워진 크기가 (10, 2)인 행렬

2. np.ones(shape) : shape의 모양을 가지면서 1로 채워진 ndarray 생성

# zeros()와 비슷하지만 0 대신 1로 채워져 있다는 것이 다르다
b = np.ones((3, 5), dtype = float) 
# 1. 로 체워진 크기가 (3, 5)인 행렬

3. np.full(shape, x) : shape의 모양을 가지면서 x로 채워진 ndarray 생성

# zeros, ones와 비슷하지만 이번엔 x 값으로 채워져 있다는 것이 다르다.
c = np.full((3, 5), 3.14) 
# 3.14로 채워진 크기가 (3, 5)인 행렬

 

범위를 지정하여 배열 만들기 : np.arange(), np.linspace()

4. np.arange(start, stop, step) : range 함수와 동일하게 작동하면서 ndarray를 반환한다. start부터 stop까지, step만큼 건너뛴 값으로 이루어진 ndarray를 반환한다. 

# 4-1. start의 default 값은 0, step의 default 값은 1이다.
# 4-2. 값이 하나 주어지면 stop을 초기화 한다.
# 4-3. 값이 두 개 주어지면 start, stop을 초기화 한다.
# ★ step의 값이 정수가 아닌 경우 값이 항상 일정하지 않을 수 있으므로, 이때는 numpy.linspace를 사용하는 것이 더 좋다.
d = np.arange(0, 20, 2) # array([0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
# 0에서 2씩 더해 20까지 채우는 배열 생성 (20은 stop이므로 포함 안됨)

5. np.linspace(start, stop, num) : arange와는 다르게, start부터 stop까지 num만큼의 요소를 가지는 등간격의 ndarray를 반환한다. arange와의 차이점이라고 하면 linspace는 start, stop 모두 포함한다.

[0.   0.25 0.5  0.75 1.   1.25 1.5  1.75 2.  ]
[0.         0.06346652 0.12693304 0.19039955 0.25386607 0.31733259
0.38079911 0.44426563 0.50773215 0.57119866 0.63466518 0.6981317
0.76159822 0.82506474 0.88853126 0.95199777 1.01546429 1.07893081
1.14239733 1.20586385 1.26933037 1.33279688 1.3962634  1.45972992
1.52319644 1.58666296 1.65012947 1.71359599 1.77706251 1.84052903
1.90399555 1.96746207 2.03092858 2.0943951  2.15786162 2.22132814
2.28479466 2.34826118 2.41172769 2.47519421 2.53866073 2.60212725
2.66559377 2.72906028 2.7925268  2.85599332 2.91945984 2.98292636
3.04639288 3.10985939 3.17332591 3.23679243 3.30025895 3.36372547
3.42719199 3.4906585  3.55412502 3.61759154 3.68105806 3.74452458
3.8079911  3.87145761 3.93492413 3.99839065 4.06185717 4.12532369
4.1887902  4.25225672 4.31572324 4.37918976 4.44265628 4.5061228
4.56958931 4.63305583 4.69652235 4.75998887 4.82345539 4.88692191
4.95038842 5.01385494 5.07732146 5.14078798 5.2042545  5.26772102
5.33118753 5.39465405 5.45812057 5.52158709 5.58505361 5.64852012
5.71198664 5.77545316 5.83891968 5.9023862  5.96585272 6.02931923
6.09278575 6.15625227 6.21971879 6.28318531]

np.linspace(0, 2, 9)는 0부터 2까지 9개의 숫자를 갖는 어레이를 만듭니다.

np.linspace(0, 2*pi, 100)와 같이 사용하면, 여러 포인트의 함수값을 얻을 때 유용합니다.