본문 바로가기
Python

[파이썬] 넘파이: 인덱스, 슬라이싱, delete, append, insert, copy, unique

by eyoo 2022. 4. 28.

4행 5열인 2차원 배열 X에 70보다 큰 데이터가 몇개있는지 확인하자.

 

 

70보다 큰 데이터는 True가, 아닌것은 False가 나오는걸 볼수있다.

 

in:

X > 70

out:

array([[ True,  True, False, False,  True],
       [False, False, False, False, False],
       [False, False, False, False, False],
       [ True, False, False, False, False]])

 

 

sum함수를 이용하여 70보다 큰 데이터의 개수를 확인할수 있다.

 

in:

(X > 70).sum()

out:

4

# True는 1, False는 0인 성질을 이용해 셀수있다.

 

 

X 중 70보다 큰 데이터만 가져온다고 한다면 

 

in:

X[X > 70]

out:

array([91, 87, 88, 82])

# 리스트와 다른 데이터 스트럭쳐에서 했던것 처럼 대괄호를 활용하면 된다.

 

 

1차원 배열에서 원하는 인덱스의 수를 가져오자

 

 

3번 인덱스 안에 있는 숫자 2를 가져오자

 

in:

x[3]

out:

2

# 대괄호에 인덱스를 넣어 원하는 수를 가져오면 된다.

 

 

2차원 배열에서 원하는 인덱스의 수를 가져오자

 

 

1행의 4열에 있는 81을 가져오자

 

in:

X[0,3]

out:

81

# 콤마를 기준으로 왼쪽에는 행, 오른쪽은 열의 인덱스를 입력하면 된다.

 

 

delete 함수를 사용하여 데이터를 지정해서 삭제할수있다.

 

x = np.array([ 7,  3,  5,  2, 12,  2,  1])

 

네번째 데이터인 2를 삭제하자

 

in:

np.delete(x,3)

out:

array([ 7,  3,  5, 12,  2,  1])

※ 함수를 이용해서 삭제된걸 볼수있지만 원본은 삭제되지 않는다. 따라서 따로 변수저장을 해줘야 한다.

 

 

삭제할 인덱스가 2개 이상일때 리스트에 담아서 입력하면된다.

 

x = np.array([ 7,  3,  5, 12,  2,  1])

 

두번째와 마지막 데이터를 삭제하자

 

in:

np.delete(x,[1,-1])

out:

array([ 7,  5, 12,  2])

 

 

2차원 배열의 경우 axis를 활용해야한다.

 

X = np.array([

[80, 50, 60, 81, 78],
[70, 46, 41,  2, 23],
[89, 87, 97, 91, 54],
[ 7,  1,  4, 60, 77]])

 

3번째 행을 삭제하자

 

in:

np.delete(X,2,axis=0)

out:

array([[80, 50, 60, 81, 78],
       [70, 46, 41,  2, 23],
       [ 7,  1,  4, 60, 77]])

# 열을 삭제하고 싶으면 axis 값을 1로 설정하면된다.

※ 만약 세번째 파라미터를 따로 설정하지 않고 2차원 배열의 데이터를 삭제하면 1차원 배열로 나온다.

 

 

2차원 배열 또한 2개 이상의 행또는 열을 삭제 하고싶을때 리스트에 담아서 입력하면 된다.

 

in:

np.delete(X,[0,2,3],axis=1)

out:

array([[50, 78],
       [46, 23],
       [87, 54],
       [ 1, 77]])

 

 

 

append 함수를 활용해 항목을 끝에 추가할수있다

 

1차원 배열일때:

 

x = np.array([ 7,  3,  5, 12,  2,  1])

 

배열에 100을 추가하자

 

in:

np.append(x, 100)

out;

array([  7,   3,   5,  12,   2,   1, 100])

# 두개 이상의 항목을 추가하고 싶을때는 리스트에 넣어서 추가하면된다. (예: np.append(x, [200,300,350]))

 

 

2차원 배열일때:

 

a = np.array([[0, 1, 2, 3, 4]]) (2차원 배열)

X = np.array([
[80, 50, 60, 81, 78],
[70, 46, 41,  2, 23],
[89, 87, 97, 91, 54],
[ 7,  1,  4, 60, 77],

 

in:

np.append(X,a,axis=0)

out:

array([[80, 50, 60, 81, 78],
       [70, 46, 41,  2, 23],
       [89, 87, 97, 91, 54],
       [ 7,  1,  4, 60, 77],
       [ 0,  1,  2,  3,  4]])

# np.append(받을배열 ,넣을배열, axis=축값)

※ 만약 2차원 배열에 1차원 배열을 append하면 에러가 나온다.

 

 

insert함수를 이용해 항목을 원하는 위치에 추가할수있다.

 

x = np.array([ 7,  3,  5, 12,  2,  1])

 

세번째 자리에 100을 추가하자

 

in:

np.insert(x,2,100)

out:

array([  7,   3, 100,   5,  12,   2,   1])

 

 

2차원 배열에 insert를 사용하자

 

in;

np.insert(X,1,a,axis= 0)

out:

array([[80, 50, 60, 81, 78],
       [ 0,  1,  2,  3,  4],
       [70, 46, 41,  2, 23],
       [89, 87, 97, 91, 54],
       [ 7,  1,  4, 60, 77]])

# 두번째 파라미터에 행,열의 인덱스를 넣어준다.

※ 열에 insert하려면 1차원 배열인 벡터를 넣어야 한다.

 

 

배열을 슬라이싱 하자

 

1차원 배열일때는 리스트를 슬라이싱 할때처럼 인덱스를 입력해주면 된다.

 

x = np.array([ 7,  3,  5, 12,  2,  1])

 

두번째에서 세번째 데이터를 가져오자

 

in:

x[1:4]

out:

array([ 3,  5, 12])

 

 

2차원 배열일때 슬라이싱 할때는 콜론' : '을 사용하자

 

X = np.array([
[80, 50, 60, 81, 78],
[70, 46, 41,  2, 23],
[89, 87, 97, 91, 54],
[ 7,  1,  4, 60, 77]])

 

세번째 행, 세번째 열 까지만 가져온다면

 

in:

X[0:3, 0:3]

out:

array([[80, 50, 60],
       [70, 46, 41],
       [89, 87, 97]])

 

두번째 행만 가져온다면

 

in:

X[1:2, :]

out:

array([[70, 46, 41,  2, 23]])

# 만약 세번째 열을 가져오려고 한다면 X[ : , 2:3]을 입력해면된다.

 

 

세번째 행 네번째 열에 있는 91을 100으로 바꾸고자 하면

 

X = np.array([
[80, 50, 60, 81, 78],
[70, 46, 41,  2, 23],
[89, 87, 97, 91, 54],
[ 7,  1,  4, 60, 77]])

 

in:

X[2,3] = 100
X

out:

array([[ 80,  50,  60,  81,  78],
       [ 70,  46,  41,   2,  23],
       [ 89,  87,  97, 100,  54],
       [  7,   1,   4,  60,  77]])

※ 다른 변수로 자른 배열을 지정하고 배열의 데이터를 변경하면 원본도 바뀐다.

    따라서 원본을 유지하며 부분만 따로 바꾸려고 한다면 따로 복사 해야한다.

 

 

copy함수를 이용해 복사하자

 

in:

Z = X[0: 3, 0:2].copy()
Z[0,0] = 100
Z

out:

array([[100,  12],
       [ 57,  81],
       [ 52,  28]])

 

 

원하는 행, 열을 슬라이싱해서 가져오려고 할때

 

X = np.array([
[ 61,  12,  80,  61, 100],
[ 57,  81,  14,   8,  95],
[ 52,  28,  90,  69,  98],
[ 47,  66,  70,  57,  91]])

 

첫번째 행과 세번째 행만 가져오자

 

in:

X[[0,2],]

out:

array([[ 61,  12,  80,  61, 100],
       [ 52,  28,  90,  69,  98]])

 

 

unique 함수로 중복된것을 제거한 값만 리스트로 가져올수있다.

 

x = np.array([ 1,  5,  3,  1, 40, 22, 33, 56, 12,  1,  5,  3])

 

in:

np.unique(x)

out:

array([ 1,  3,  5, 12, 22, 33, 40, 56])

 

 

boolean 연산

 

데이터 중에서 50보다 크고 80보다 작은 데이터만 가져오자

 

X = np.array([
[  61,  12,  80,  61, 100],
[ 57,  81,  14,   8,  95],
[ 52,  28,  90,  69,  98],
[ 47,  66,  70,  57,  91]])

 

in:

X[(X > 50) & (X < 80)]

out:

array([61, 61, 57, 52, 69, 66, 70, 57])

# 배열에서는 and문을 쓸수 없다. 대신 앤퍼센트 '&'로 사용할수있다.

 

 

데이터 중에서 50보다 작거나 80보다 큰 데이터만 가져오자

 

in:

X[(X < 50) | (X > 80)]

out:

array([ 12, 100,  81,  14,   8,  95,  28,  90,  98,  47,  91])

# 배열에서는 or문도 쓸수 없다. 대신 세로줄 ' | '로 사용할수있다.

 

 

배열에 직접 계산을 하자

 

in:

X = np.array([[2, 6],[7, 5]])
Y = np.array([[63, 84],[63, 42]])
X+Y

out:

array([[65, 90],
       [70, 47]])

# 같은 위치의 데이터끼리 연산되는것을 볼수있다.

 

 

배열에 직접 연산을 하자

 

in:

score = np.array([56, 75, 88, 92, 66])
score - 5

out:

array([51, 70, 83, 87, 61])

# 각열의 데이터가 5씩 마이너스된것을 확인할수 있다.

댓글