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시킨 다음에 원소 수정 안 하겠다

+ Recent posts