Untitled2

ndarray.flatten(order='C)

: 텐서를 벡터로 만듦

In [1]:
import numpy as np
In [2]:
A = np.arange(4)
B = A.reshape((2, 2))
C = B.flatten()

print(A, '\n')
print(B, '\n')
print(C, '\n')
[0 1 2 3] 

[[0 1]
 [2 3]] 

[0 1 2 3] 

ndarray.ravel([])

:텐서를 벡터로 만듦

In [7]:
A = np.arange(4)
B = A.reshape((2, 2))
C = B.ravel()

print(A, '\n')
print(B, '\n')
print(C, '\n')
[0 1 2 3] 

[[0 1]
 [2 3]] 

[0 1 2 3] 

flatten과 ravel의 차이점을 설명하기 전에 copy와 view 알아보기

copy : 메모리 용량 많이 차지 but b를 수정해도 a(원본) 영향 없음

view : 메모리 적게 사용가능 but b를 수정하면 a(원본)수정됨

In [8]:
a = np.arange(5)
b = a.view()

b[0] = 10 

print(a)
print(b)
[10  1  2  3  4]
[10  1  2  3  4]

a와 b는 같은 메모리 address 그래서 b를 수정하면 a도 수정됨

   

In [10]:
a = np.arange(5)
b = a[:3]

b[0] = 10 

print(a)
print(b)
[10  1  2  3  4]
[10  1  2]

넘파이에서 슬라이싱은 view를 만드는 것

슬라이싱을 통해 만들어진 값(b)을 수정하면 원본(a)에도 영향을 미침

   

In [12]:
a = np.arange(5)
b = a.copy()

b[0] = 10 

print(a)
print(b)
[0 1 2 3 4]
[10  1  2  3  4]

a, b는 다른 메모리, 서로 영향없음

 
 
 
 

base

In [13]:
a = np.arange(5)
b = a.copy()
c = a.view()
d = a[:3]

print(b.base is a)
print(c.base is a)
print(d.base is a)
False
True
True

view를 통해 만들어진 객체들의 base는 메모리 address를 제공해준 ndarray다

ex) b,c의 base는 a

 
 
 
 

In [17]:
a = np.arange(4)
b = np.reshape(a, (2, 2))
b[0, 0] = 10

print(b.base is a, '\n')
print(a, '\n')
print(b)
True 

[10  1  2  3] 

[[10  1]
 [ 2  3]]
In [18]:
a = np.arange(4)
b = np.resize(a, (2, 2))
b[0, 0] = 10

print(b.base is a, '\n')
print(a, '\n')
print(b)
False 

[0 1 2 3] 

[[10  1]
 [ 2  3]]

reshape으로 만들었을 때는 원소 바꿀 때 조심

view를 통해서 만드므로 원본 영향 줌

 

resize는 copy를 통해서 만듦, 원본 영향없음

In [21]:
a = np.arange(4)
b = np.reshape(a, (2,2)).copy() # 이렇게 쓰면 원본 영향없음

b[0,0] = 10

print(b.base is a, '\n')
print(a, '\n')
print(b)
False 

[0 1 2 3] 

[[10  1]
 [ 2  3]]

 
 
 
 

In [26]:
a = np.random.randint(0, 10, (3,3))
b = a.ravel()
b[0] = 10 

print(b.base is a, '\n')
print(a, '\n')
print(b)
True 

[[10  1  2]
 [ 9  2  2]
 [ 1  9  6]] 

[10  1  2  9  2  2  1  9  6]
In [27]:
a = np.random.randint(0, 10, (3,3))
b = a.flatten()
b[0] = 10 

print(b.base is a, '\n')
print(a, '\n')
print(b)
False 

[[1 4 9]
 [0 2 7]
 [8 8 2]] 

[10  4  9  0  2  7  8  8  2]

ravel: view를 통해서 만듦, 메모리 효과적으로 사용

: flatten시킨 다음에 원소 수정하겠다

 

flatten: copy를 통해서 만듦, 원본 영향 없음

: flatten시킨 다음에 원소 수정 안 하겠다

Untitled2

numpy.reshape(a, newshape, order='C)

In [2]:
import numpy as np

reshape: 원하는 shape으로 바꿔줌

In [6]:
a = np.arange(10)
b = np.reshape(a, (2, 5))
c = a.reshape((2, 5))

print('a:\n', a)
print('b:\n', b)
print('c:\n', c)
a:
 [0 1 2 3 4 5 6 7 8 9]
b:
 [[0 1 2 3 4]
 [5 6 7 8 9]]
c:
 [[0 1 2 3 4]
 [5 6 7 8 9]]

하나를 지정하지 않고 -1을 쓰면 자동으로 shape이 됨

계산이 귀찮거나 row나 column 강조하고싶을 때 사용해도 좋음

In [11]:
a = np.arange(10)

b = a.reshape((2, -1)) # row가 강조되는 느낌 
c = a.reshape((5, -1))

print(b.shape)
print(c.shape)
(2, 5)
(5, 2)

numpy.resize(a, new_shape)

원소의 개수를 바꿔줄 때 유용

아래의 코드는 reshape과 결과가 같음

In [12]:
a = np.arange(10)

b = np.resize(a, (2, 5))

print('a:\n', a)
print('b:\n', b)
a:
 [0 1 2 3 4 5 6 7 8 9]
b:
 [[0 1 2 3 4]
 [5 6 7 8 9]]

but reshape은 원소의 개수가 다르면 오류가 나지만 resize는 자동으로 맞춰줌

In [14]:
a = np.arange(5)

b = np.reshape(a, (10,))
print('b:\n', b)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-14-fcc2b57f1b7d> in <module>
      1 a = np.arange(5)
      2 
----> 3 b = np.reshape(a, (10,))
      4 print('b:\n', b)

<__array_function__ internals> in reshape(*args, **kwargs)

~\anaconda3\lib\site-packages\numpy\core\fromnumeric.py in reshape(a, newshape, order)
    299            [5, 6]])
    300     """
--> 301     return _wrapfunc(a, 'reshape', newshape, order=order)
    302 
    303 

~\anaconda3\lib\site-packages\numpy\core\fromnumeric.py in _wrapfunc(obj, method, *args, **kwds)
     59 
     60     try:
---> 61         return bound(*args, **kwds)
     62     except TypeError:
     63         # A TypeError occurs if the object does have such a method in its

ValueError: cannot reshape array of size 5 into shape (10,)
In [16]:
a = np.arange(5)

b = np.resize(a, (10,))
print('b:\n', b)
# 앞에서부터 반복해서 만듦 
b:
 [0 1 2 3 4 0 1 2 3 4]

size가 늘어나도 오류가 안나므로 조심해야 함

 
 

resize는 in-place (return값이 없고 바로 바뀜)

In [18]:
a = np.arange(4)

b = a.resize((2, 2))

print('a: \n', a)
print('b:\n', b)
a: 
 [[0 1]
 [2 3]]
b:
 None

그래서 아래와 같이 사용하는게 좋음

In [21]:
a = np.arange(5)

a.resize((2,2))
print(a)
[[0 1]
 [2 3]]

reshape은 오류남

In [24]:
a = np.arange(5)

a.reshape((2,2))
print(a)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-24-f82f97014a0d> in <module>
      1 a = np.arange(5)
      2 
----> 3 a.reshape((2,2))
      4 print(a)

ValueError: cannot reshape array of size 5 into shape (2,2)

np.ndim -> 차원 

np.shape -> row, column 확인 

np.size -> 개수 

 

.dtype -> 데이터 타입확인 ex) int64, float64 

         -> 데이터 타입 명시적으로 설정 가능 

int8_np = np.array([1, 2, 3], dtype=np.int8) 

: 데이터 타입 int8이 됨 

 

.itemsize ->넘파이 array에 많은 값이 있을 떄 값들이 각각 몇 바이트인지 숫자로 표현, 원소1개 용량 표현

 

.nbytes -> 넘파이 array의 원소들이 차지하는 용량을 담고 있는 데이터

          -> size*itemsize 와 같음  

1. 넘파이를 쓰는 이유

: 수치를 다루는데 특화됨, 넘파이가 제공하는 기능을 사용하기 위해 

 

* object란? 

- object = data + methods
- 파이썬에서는 모든 것이 object(객체)다. 
- 변수선언하는 것도 다 object 
- object를 만드는 과정 -> instantiation 

 

 

2. 간단한 기능 


- dir() -> 기능 확인 
- type() -> 타입 확인 

 

 

3. ndarray

- np.array()

- np.zeros(shape=(a,b)) -> 0으로 채운 (a,b) 

- np.ones(shape=(a,b)) -> 1로 채운 (a,b)

- np.full(shape=(a,b), fill_value=x) -> x값으로 (a,b)형태로 만듦.

- np.empty(shape=(a,b)) -> 공간 만든다고 생각 ( 쓰레기 값 들어감), 나중에 값 채울 때 주로 사용 

 

- np.zeros_like(M) -> M과 shape 같음, 0으로 채움 

- np.ones_lke(M) -> M과 shape 같음, 1로 채움 
- np.full_like(M, fill_value=x) -> M과 shape 같음, x로 값채움 
- np.empty_like(M) -> M과 shape같음, 쓰레기값 들어감 

 

* 파이썬에서 range() 는 소수점을 사용하면 에러가 나지만 넘파이에서는 arange 쓸 때 소수점 가능함 

4. linspace와 arange 차이점  

: 같은 결과를 만들 수 있음 

print(np.arange(0, 1+0.25, 0.25))
print(np.linspace(0, 1, 5))

결과는 [0. 0.25 0.5 0.75 1. ] 으로 동일함 


- np.linspace(start, stop, num=50 ...) 

: 처음값과 끝값을 포함

: 몇 개로 만들지, -> 개수 강조할 때 사용하면 코드 가독성 †

 

- np.arange([start], stop, [step] ...), [] 생략가능

: 끝값 포함하지 않음 
: 범위, step -> 구간, 간격 강조할 때 사용하면 코드 가독성 †

 

 

5. Normal Distributions

- random.randn(d0,  d1, ..., dn) -> 차원값

: 표준정규분포: 평균이 0이고 표준편차가 1인 것 
: 균등하게 샘플링 함 

 

-random.normal(loc=0.0,  scale=1.0, size=None) 
: loc=평균, scale=표준편차

 

-random.uniform(low=0.0,  high=1.0, size=None)
: 범위 지정가능 

 

-random.randint(low, high=None, size=None, dtype=int) 
: high 숫자 포함하지 않음 
: int형태로 출력됨

 

 

'Python > Numpy' 카테고리의 다른 글

np.reshape, np.resize 차이점2, flatten, ravel, copy, view  (0) 2021.03.30
np.reshape, np.resize 차이점  (0) 2021.03.30
ndim, shape, size  (0) 2021.03.29

+ Recent posts