1차원 배열의 인덱스, 슬라이스, 그리고 반복 등은
리스트나 연속열(sequence)와 같은 방식으로 실행된다.
파이썬에서 숫자의 시작은 0부터 시작한다.
import numpy as np
np.set_printoptions(precision=3)
#랜덤 추출할 경우 한번 시행에서 나온 숫자는 고정되어야 할 필요가 있다.
#이 경우 사용되는 문이 .seed()이다.
np.random.seed(1)
a=np.random.randn(10)
a
array([ 1.624, -0.612, -0.528, -1.073, 0.865, -2.302, 1.745, -0.761,
0.319, -0.249])
#이 경우 사용되는 문이 .seed()이다.
np.random.seed(1)
a=np.random.randn(10)
a
array([ 1.624, -0.612, -0.528, -1.073, 0.865, -2.302, 1.745, -0.761,
0.319, -0.249])
a[2]#0부터 시작하므로 3번째 값을 호출
-0.5281717522634557
-0.5281717522634557
연속적인 인덱스의 값을 호출할 경우 '시작인덱스:마지막 인덱스'를 사용한다.
0번째 부터 호출할 경우 시작인덱스는 생략된다. 예를들어 1: 6이면 1번째부터 5번째값을 호출하는 것이다.
즉, 마지막인덱스 값은 호출에서 제외된다.
x[a:b] == a≤x<b
a[:4]
array([ 1.624, -0.612, -0.528, -1.073])
array([ 1.624, -0.612, -0.528, -1.073])
#호출시 콜론(:)을 두번 사용하는 경우 즉 '시작:끝:조건'
a[:6:2]#0~6 번째의 값들을 중에서 각 2단계의 값 즉, 0, 2, 4 번쨰 값 호출
array([ 1.624, -0.528, 0.865])
a[:6:2]#0~6 번째의 값들을 중에서 각 2단계의 값 즉, 0, 2, 4 번쨰 값 호출
array([ 1.624, -0.528, 0.865])
a[:6:2]=0 #호출된 값을 0으로 치환
a
array([ 0. , -0.612, 0. , -1.073, 0. , -2.302, 1.745, -0.761,
0.319, -0.249])
a
array([ 0. , -0.612, 0. , -1.073, 0. , -2.302, 1.745, -0.761,
0.319, -0.249])
a[::-1] #처음부터 끝까지 역순으로 반환
array([-0.249, 0.319, -0.761, 1.745, -2.302, 0. , -1.073, 0. ,
-0.612, 0. ])
array([-0.249, 0.319, -0.761, 1.745, -2.302, 0. , -1.073, 0. ,
-0.612, 0. ])
a[:-1]#-1은 객체의 마지막을 의미하는 것으로서 마지막을 제외하고 모두 반환
array([ 0. , -0.612, 0. , -1.073, 0. , -2.302, 1.745, -0.761,
0.319])
array([ 0. , -0.612, 0. , -1.073, 0. , -2.302, 1.745, -0.761,
0.319])
다차원 베열의 경우는 행과 열을 모두 지정하여 값을 호출한다.
다차원 배열의 경우 객체.reshape(행, 열) 함수를 사용하여 다차원 행렬을 생성
다차원 배열에서의 호출은 [행,열]의 인덱스를 모두 사용한다.
두 인자 모두 전달해야 하며 ":" 또는 "..."는 all의 의미를 갖는다.
즉, x[:,1]은 두번째 열의 모든 행이라는 의미이다.
np.random.seed(3)
a=np.random.randn(5*4).reshape(5,4)
a
array([[ 1.789, 0.437, 0.096, -1.863],
[-0.277, -0.355, -0.083, -0.627],
[-0.044, -0.477, -1.314, 0.885],
[ 0.881, 1.71 , 0.05 , -0.405],
[-0.545, -1.546, 0.982, -1.101]])
a=np.random.randn(5*4).reshape(5,4)
a
array([[ 1.789, 0.437, 0.096, -1.863],
[-0.277, -0.355, -0.083, -0.627],
[-0.044, -0.477, -1.314, 0.885],
[ 0.881, 1.71 , 0.05 , -0.405],
[-0.545, -1.546, 0.982, -1.101]])
a[:,2]
array([ 0.096, -0.083, -1.314, 0.05 , 0.982])
array([ 0.096, -0.083, -1.314, 0.05 , 0.982])
a[...,2]
array([ 0.096, -0.083, -1.314, 0.05 , 0.982])
array([ 0.096, -0.083, -1.314, 0.05 , 0.982])
#반복문 for에서 인자명을 row, 또는 column으로 할 경우 모든 배열의 값을 반환 한다.
for row in a:
print(row)
for row in a:
print(row)
[ 1.789 0.437 0.096 -1.863]
[-0.277 -0.355 -0.083 -0.627]
[-0.044 -0.477 -1.314 0.885]
[ 0.881 1.71 0.05 -0.405]
[-0.545 -1.546 0.982 -1.101]
[-0.277 -0.355 -0.083 -0.627]
[-0.044 -0.477 -1.314 0.885]
[ 0.881 1.71 0.05 -0.405]
[-0.545 -1.546 0.982 -1.101]
for column in a:
print(column)
print(column)
[ 1.789 0.437 0.096 -1.863]
[-0.277 -0.355 -0.083 -0.627]
[-0.044 -0.477 -1.314 0.885]
[ 0.881 1.71 0.05 -0.405]
[-0.545 -1.546 0.982 -1.101]
[-0.277 -0.355 -0.083 -0.627]
[-0.044 -0.477 -1.314 0.885]
[ 0.881 1.71 0.05 -0.405]
[-0.545 -1.546 0.982 -1.101]
reshape(): 배열이 차원을 다시 설정할 경우 사용한다.
resize(): reshape()와 같다.
그러나 reshape()에ㅔ 의한 변화는 원객체는 변화시키지 않는 반면
resize()는 원객체를 변화시킨다. ravel(): 배열의 모든 원소를 행단위로 구분하여 1차원으로 재배열 시킴
a.shape #객체 a의 차원을 반환
(5, 4)
(5, 4)
b=a.reshape(4,5) #차원을 변경한 새로운 객체를 생성.그러나 원객체는 변경되지않음
print(b)
print(b)
[[ 1.789 0.437 0.096 -1.863 -0.277]
[-0.355 -0.083 -0.627 -0.044 -0.477]
[-1.314 0.885 0.881 1.71 0.05 ]
[-0.405 -0.545 -1.546 0.982 -1.101]]
print(a)
[-0.355 -0.083 -0.627 -0.044 -0.477]
[-1.314 0.885 0.881 1.71 0.05 ]
[-0.405 -0.545 -1.546 0.982 -1.101]]
print(a)
[[ 1.789 0.437 0.096 -1.863]
[-0.277 -0.355 -0.083 -0.627]
[-0.044 -0.477 -1.314 0.885]
[ 0.881 1.71 0.05 -0.405]
[-0.545 -1.546 0.982 -1.101]]
[-0.277 -0.355 -0.083 -0.627]
[-0.044 -0.477 -1.314 0.885]
[ 0.881 1.71 0.05 -0.405]
[-0.545 -1.546 0.982 -1.101]]
c=b.resize(5,4)#resize는 전달된 객체자체가 변경된다.
#이러한 함수의 경우 새로운 객체의 생성은 허가되지 않는다. 즉, 객체 c는 생성되지 않음
print(c)
#이러한 함수의 경우 새로운 객체의 생성은 허가되지 않는다. 즉, 객체 c는 생성되지 않음
print(c)
None
print(b)
[[ 1.789 0.437 0.096 -1.863]
[-0.277 -0.355 -0.083 -0.627]
[-0.044 -0.477 -1.314 0.885]
[ 0.881 1.71 0.05 -0.405]
[-0.545 -1.546 0.982 -1.101]]
[[ 1.789 0.437 0.096 -1.863]
[-0.277 -0.355 -0.083 -0.627]
[-0.044 -0.477 -1.314 0.885]
[ 0.881 1.71 0.05 -0.405]
[-0.545 -1.546 0.982 -1.101]]
#reshape() 함수중 행,열의 인수중 하나에 -1을 전달하면 나머지 차원은 자동으로 생성
b=a.reshape(2,-1)
b
array([[ 1.789, 0.437, 0.096, -1.863, -0.277, -0.355, -0.083, -0.627,
-0.044, -0.477],
[-1.314, 0.885, 0.881, 1.71 , 0.05 , -0.405, -0.545, -1.546,
0.982, -1.101]])
b=a.reshape(2,-1)
b
array([[ 1.789, 0.437, 0.096, -1.863, -0.277, -0.355, -0.083, -0.627,
-0.044, -0.477],
[-1.314, 0.885, 0.881, 1.71 , 0.05 , -0.405, -0.545, -1.546,
0.982, -1.101]])
a.ravel()#5*4 차원의 행렬로 된 배열을 1차원 배열로 재배치
array([ 1.789, 0.437, 0.096, -1.863, -0.277, -0.355, -0.083, -0.627,
-0.044, -0.477, -1.314, 0.885, 0.881, 1.71 , 0.05 , -0.405,
-0.545, -1.546, 0.982, -1.101])
array([ 1.789, 0.437, 0.096, -1.863, -0.277, -0.355, -0.083, -0.627,
-0.044, -0.477, -1.314, 0.885, 0.881, 1.71 , 0.05 , -0.405,
-0.545, -1.546, 0.982, -1.101])
배열 결합
배열들을 결합시키위해 vstack(), hstack() 함수를 사용한다. np.vstack([객체1, 객체2]): 각 객체를 수직 결합
즉, 동일한 위치의 원소를 수직(열방향)으로 결합
np.hstack([객체1, 객체2]): 각 객체를 수평 결합
즉, 동일한 위치의 원소를 수평(행방향)으로 결합
보다 직관적으로 np.r[], np.c[]함수를 사용할 수 있다.
각각 열결합, 행결합을 반환한다.
a=np.random.randn(6).reshape(2,3)
b=np.random.randn(6).reshape(2,3)
print(a)
b=np.random.randn(6).reshape(2,3)
print(a)
[[-1.623 0.647 -0.356]
[-1.743 -0.597 -0.589]]
print(b)
[[-0.874 0.03 -2.248]
[-0.268 1.013 0.853]]
[-1.743 -0.597 -0.589]]
print(b)
[[-0.874 0.03 -2.248]
[-0.268 1.013 0.853]]
print(np.vstack([a, b]))
[[-1.623 0.647 -0.356]
[-1.743 -0.597 -0.589]
[-0.874 0.03 -2.248]
[-0.268 1.013 0.853]]
print(np.hstack([a,b]))
[[-1.623 0.647 -0.356 -0.874 0.03 -2.248]
[-1.743 -0.597 -0.589 -0.268 1.013 0.853]]
[-1.743 -0.597 -0.589]
[-0.874 0.03 -2.248]
[-0.268 1.013 0.853]]
print(np.hstack([a,b]))
[[-1.623 0.647 -0.356 -0.874 0.03 -2.248]
[-1.743 -0.597 -0.589 -0.268 1.013 0.853]]
print(np.r_[a,b])
[[-1.623 0.647 -0.356]
[-1.743 -0.597 -0.589]
[-0.874 0.03 -2.248]
[-0.268 1.013 0.853]]
print(np.c_[a,b])
[-1.743 -0.597 -0.589]
[-0.874 0.03 -2.248]
[-0.268 1.013 0.853]]
print(np.c_[a,b])
[[-1.623 0.647 -0.356 -0.874 0.03 -2.248]
[-1.743 -0.597 -0.589 -0.268 1.013 0.853]]
[-1.743 -0.597 -0.589 -0.268 1.013 0.853]]
배열 분리
np.hsplit(객체, n): 객체의 각 행을 n개로 수평분리한다. np.vsplit(객체, n): 객체의 각 열을 n개로 수직분리한다.
a=np.floor(np.random.random(4)*10)
a
array([ 0., 2., 9., 2.])
a
array([ 0., 2., 9., 2.])
print(np.hsplit(a, 2))
[array([ 0., 2.]), array([ 9., 2.])]
print(np.hsplit(a, (2,3)))#2부분으로 분리하고 나머지를 다시 2 부분으로 분리
[array([ 0., 2.]), array([ 9.]), array([ 2.])]
print(np.hsplit(a, (2,3)))#2부분으로 분리하고 나머지를 다시 2 부분으로 분리
[array([ 0., 2.]), array([ 9.]), array([ 2.])]
얕은 복사
다음의 경우는 a, b의 두 객체 모두 1을 할당되었다. a=1
b=1
즉, 1의 값이 할당된 주소(객체)를 객체 a와 b가 모두 참조한다는 것을 의미한다.
다시말하면 객체 a와 b의 주소에 각각 1이 할당되는 것이 아니라
1이 할당된 주소 값을 a,b 객체에 할당하는 것이다. 이것을 얕은 복사라 한다.
copy 모듈의 copy()는 얕은 복사를 수행
a=1
b=1
print (id(1))
print (id(a))
print (id(b))
print(a is b)
b=1
print (id(1))
print (id(a))
print (id(b))
print(a is b)
1517009360
1517009360
1517009360
True
1517009360
1517009360
True
b=2 #객체 b에 다른 주소가 할당되었다. 그러므로 a와 b는 다른 객체를 참조한다.
print(id(2))
print (id(a))
print (id(b))
print(a is b)
print(id(2))
print (id(a))
print (id(b))
print(a is b)
1517009392
1517009360
1517009392
False
1517009360
1517009392
False
위의 경우는 한개의 값을 할당받은 객체를 참조하는 경우이다.
그러나 리스트의 경우 리스트 내의 하나의 원소가 수정되더라도
그 리스트가 점유하고 있는 객체는 같으므로 위와 같은 변경은 일어나지 않는다.깊은복사
얕은 복사와는 다른 개념으로 깊은복사는 원 객체의 값들만을 복사하여 완전히 새로운 객체를 생성한다. 그러므로 원 객체와는 다른 주소에 할당된다.
DataFrame.copy(deep=True) 데이터프레임을 복사한다. 디폴트는 깊은 복사
깊은 복사는 원 객체와 복사된 객체는 다른 객체이다.
df2=df.copy()
df2
op
|
hp
|
lp
|
cp
|
Volume
| |
Date
| |||||
2016-01-04
|
1954.47
|
1954.52
|
1918.76
|
1918.76
|
359018000
|
2016-01-05
|
1911.93
|
1937.57
|
1911.93
|
1930.53
|
446548000
|
2016-01-06
|
1934.25
|
1934.25
|
1911.61
|
1925.43
|
594612000
|
2016-01-07
|
1915.71
|
1926.41
|
1901.24
|
1904.33
|
393042000
|
2016-01-08
|
1889.42
|
1918.25
|
1883.82
|
1917.62
|
430204000
|
[id(df2), id(df)]
[1399891204024, 1399891106224]
댓글
댓글 쓰기