728x90
Numpy는 무엇인가요?¶
- Numpy는 "Numerical poython"에서 비롯된 이름이다. 기존의 파이썬은 C언어와 Java에 비해 "Numerical Computing" 에 취약하기 때문에 Numpy로 보완한다.
- Numpy는 다양한 머신러닝 라이브러리들에 적용할 수 있기 때문에, 일반 파이썬 리스트[]에 비해 강력한 성능을 보여준다.
- Numpy에서는 Python list와 비슷하게 Numpy array를 사용해 데이터를 조작한다.
Numpy의 특징 다섯가지¶
1) Numpy array는 모든 원소의 자료형이 동일해야한다.
위의 이미지는 Numpy가 지원하는 data types다.
- Numpy가 지원하는 데이터 타입은 int, uint, intp, uintp, float, complex 등이 있고 몇 비트의 메모리를 사용하는지에 따라 뒤에 숫자가 더 붙는다.
2) Numpy array는 선언할 때 크기를 지정하면, 그 뒤로 크기를 변경할 수 없다. Python list는 list.append(), pop() 등을 통해 자유롭게 원소 변경과 크기 변경이 가능하지만, Numpy array는 만들어지면 update는 가능하지만, array의 크기를 변경할 수 없다.
3) Numpy array는 내부적으로 C, C++과 같은 C언어로 구현되어 있다. 이는 Python이 Numerical Computing에 취약한 점을 보안해 Numerical Computing에서 High Performance를 내기 위해서 그렇다.
4) Numpy Array가 Python list 보다 빠른 이유 중에 하나는 원소의 Type checking을 할 필요가 없기 때문이다.
- Python list의 경우 list의 모든 element들의 Data Type을 일일이 확인 후 연산하기 때문에 Numpy array보다 큰 규모의 연산 속도가 느리다.
5) Numpy array는 universal function(through broadcast)를 제공해서 같은 연산 반복에 대해 훨씬 빠르다.
- 같은 데이터를 가지고 universal function을 사용해 역수를 구하는 연산과 for문을 돌면서 역수를 구하는 연산의 연산 시간을 측정하면 1000000개의 원소의 경우 1000배 가까이 차이나고 데이터의 크기가 커질수록 이 차이는 더 커진다.
In [4]:
import numpy as np
In [5]:
# Numpy array의 각 원소의 역수를 취하는 함수.
def reverse_num(values):
output = np.empty(len(values))
for i in range(len(values)):
output[i] = 1.0 / values[i]
return output
In [6]:
# 1부터 100까지 범위에서 1000000개를 랜덤으로 뽑아서 array를 만듭니다.
big_array = np.random.randint(1, 100, size=1000000)
In [7]:
%timeit reverse_num(big_array)
2.41 s ± 52.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [8]:
%timeit 1.0 / big_array
3.58 ms ± 160 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Numpy Basic¶
Numpy array creation¶
- python list의 선언
In [9]:
data = [1, 2, 3, 4, 5]
data, type(data) # type(data)는 data 변수의 data type을 구하는 함수다.
Out[9]:
([1, 2, 3, 4, 5], list)
- Python 2차원 list 선언
In [10]:
data2 = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
data2
Out[10]:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- Python list를 Numpy array로 변환
- np.array()
In [12]:
arr1 = np.array(data)
arr1, type(arr1), arr1.shape # arr1.shape은 arr1의 크기를 알려준다.
Out[12]:
(array([1, 2, 3, 4, 5]), numpy.ndarray, (5,))
- 2차원 list를 np.array로 변환
In [13]:
arr2 = np.array(data2)
arr2, type(arr2), arr2.shape
Out[13]:
(array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]),
numpy.ndarray,
(3, 3))
- arr2의 차원
- arr2의 크기
- arr2의 행*열
- arr2의 원소의 타입
- arr2의 원소의 사이즈(byte)
- arr2의 차지하는 메모리 공간(itemsize * size)
In [14]:
print("arr2의 차원:", arr2.ndim)
print("arr2의 크기:", arr2.shape)
print("arr2의 사이즈:", arr2.size)
print("arr2의 타입:", arr2.dtype)
print("arr2의 원소사이즈:", arr2.itemsize)
print("arr2의 메모리공간:", arr2.nbytes)
arr2의 차원: 2
arr2의 크기: (3, 3)
arr2의 사이즈: 9
arr2의 타입: int32
arr2의 원소사이즈: 4
arr2의 메모리공간: 36
Array Initialization¶
Numpy array를 초기값과 함꼐 생성¶
- 원소가 0인 array를 생성하는 np.zeros()
In [29]:
np.zeros(5)
Out[29]:
array([0., 0., 0., 0., 0.])
In [30]:
np.zeros((3,3))
Out[30]:
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
- 원소가 1인 array를 생성하는 np.ones()
In [32]:
np.ones(3)
Out[32]:
array([1., 1., 1.])
In [33]:
np.ones((3,3))
Out[33]:
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
- 0부터 9까지의 수를 자동으로 생성하는 array
In [34]:
np.arange(10)
Out[34]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
- 10부터 100까지의 수를 자동으로 생성하는 array
In [35]:
np.arange(10,101)
Out[35]:
array([ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100])
Array Operation or universal Function¶
- Numpy array를 쓰는 가장 큰 이유는 vector처럼 사용할 수 있어서다.
- vector처럼 사용 가능하면 선형대수학적 접근이 가능하다.
- 이런 이점 때문에 matplotlib, pandas, tensorflow, pytorch 등의 데이터 분석 라이브러리들이 Numpy array를 사용한다.
- 그래서 필수적으로 Numpy array 혹은 vector 데이터를 다룰 수 있어야 한다.
- Python list와 Numpy array에서 연산이 어떻게 다른지 비교
In [37]:
L1 = [1, 2, 3]
L2 = [4, 5, 6]
L1 + L2
Out[37]:
[1, 2, 3, 4, 5, 6]
In [38]:
V1 = np.array((1, 2, 3))
V2 = np.array((4, 5, 6))
V1 + V2
Out[38]:
array([5, 7, 9])
In [41]:
L1 - L2
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-41-42c866d5c011> in <module>
----> 1 L1 - L2
TypeError: unsupported operand type(s) for -: 'list' and 'list'
In [42]:
V1 - V2
Out[42]:
array([-3, -3, -3])
In [43]:
L1 * L2
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-43-b131a48f1322> in <module>
----> 1 L1 * L2
TypeError: can't multiply sequence by non-int of type 'list'
In [44]:
V1 * V2
Out[44]:
array([ 4, 10, 18])
In [45]:
L1 / L2
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-45-5839bfd14b9c> in <module>
----> 1 L1 / L2
TypeError: unsupported operand type(s) for /: 'list' and 'list'
In [46]:
V1 / V2
Out[46]:
array([0.25, 0.4 , 0.5 ])
- Numpy array는 벡터로 표현하여 연산하기 때문에 원소들의 순서대로 연산한다.
- Python list는 '+' 연산의 경우 원소를 추가하지만 나머지 연산은 오류가 발생한다.
728x90
반응형
'AI > K-Digital Training' 카테고리의 다른 글
005. BeautifulSoup으로 웹크롤링 학습1 (0) | 2021.08.01 |
---|---|
004. requests 모듈로 웹 크롤링 학습 (0) | 2021.07.31 |
003. Numpy_Study2 (0) | 2021.07.30 |
001. 데이터 분석이란?? (0) | 2021.07.20 |
000. K-Digital Training AI 기반 데이터 과학 과정에 참여하게 됐습니다. (0) | 2021.07.20 |