관리 메뉴

개발자비행일지

[Python] List끼리 연산 | zip | numpy | map 본문

▶ Python

[Python] List끼리 연산 | zip | numpy | map

Cyber0946 2024. 7. 7. 11:58

여러 가지 상황에서 리스트끼리의 연산이 필요할 때가 있다.해당 글은 리스트끼리의 더하기, 빼기, 곱하기 등의 연산을 위한 3가지 방법에 대해 정리하였다.

목차

내장함수 zip

1-1) 1차원 리스트

1-2) 2차원 리스트

numpy 모듈

내장함수 map

1-1) 1차원 리스트

1-2) 2차원 리스트

내장함수 zip

zip은 여러 배열을 튜플로 묶어주는 연산을 해준다.
파이썬 내장함수이므로 따로 모듈을 import해줄 필요는 없다.

1차원 리스트

다음과 같이 원소의 길이가 같은 1차원 배열(리스트)가 a, b가 있을 때, 동일한 위치에 있는 원소를 튜플로 묶어 리턴한다.
iterable한 결과(zip 객체)로 리턴하므로 꼭 for문이나 iterator와 함께 사용되어야 한다.

  • iterable, iterator 개념을 잘 모르겠다면 검색하여 찾아보는 것을 권장
a = [1, 2, 3, 4, 5]
b = [6, 7, 8, 9, 0]

print([i for i in zip(a, b)])
#결과
#[(1, 6), (2, 7), (3, 8), (4, 9), (5, 0)]

해당 결과를 이용하여 두 값에 대한 연산을 진행하면 된다!

# 두 배열의 각 자리값끼리 곱한 값의 총합 구하기
a = [1, 2, 3, 4, 5]
b = [6, 7, 8, 9, 0]

result = [i*j for i, j in zip(a, b)]
print("result : ", result, ", sum : ", sum(result))
#결과
#result :  [6, 14, 24, 36, 0],  sum :  80

2차원 리스트

그렇다면 2차원 리스트에서 zip은 어떻게 동작할까? 1차원 배열과 같이 for문 하나로 가능할까?

a = [[1, 2], [2, 3]]
b = [[3, 4], [5, 6]]

#단순 zip
print([i for i in zip(a, b)])
#결과
#[([1, 2], [3, 4]), ([2, 3], [5, 6])]

그렇지 않다. 2차원 배열의 각 원소 간 연산을 처리하기 위해서 2중으로 for문이 필요하다

a = [[1, 2], [2, 3]]
b = [[3, 4], [5, 6]]

result = []

#각 자리 원소를 곱한 것들의 총 합
for i in range(len(a)):
    temp = [i * j for i, j in zip(a[i], b[i])]
    result.append(temp)
print("result : ", result)
# result :  [[3, 8], [10, 18]]

zip을 활용한 예시: 퍼셉트론

리스트의 각 요소를 곱한 값을 더하는 작업은 퍼셉트론 같은 간단한 인공신경망 모델에서도 사용된다. 아래는 zip을 이용하여 퍼셉트론의 출력을 계산하는 예시이다.

def activation(s):
    return 1 if s > 0 else 0

def perceptron(w, x):
    # 두 배열의 각 자리값끼리 곱한 값의 총합 구하기 
    output = sum(wi * xi for wi, xi in zip(w, [1] + x))
    y = activation(output)
    return y, output

# x_1, x_2, x_3, x_4의 값을 순서대로 list 형태로 저장
x = [1, 2, 3, 4]

# w_0, w_1, w_2, w_3, w_4의 값을 순서대로 list 형태로 저장
w = [2, -1, 1, 3, -2]

# 퍼셉트론의 결과를 출력
y, output = perceptron(w, x)

print('output: ', output)
print('y: ', y)
#결과
# output:  4
# y:  1

이 예시에서 zip은 다음과 같이 동작한다:

  • w[0] * 1 -> 2 * 1 = 2
  • w[1] * x[0] -> -1 * 1 = -1
  • w[2] * x[1] -> 1 * 2 = 2
  • w[3] * x[2] -> 3 * 3 = 9
  • w[4] * x[3] -> -2 * 4 = -8

결국, 2 - 1 + 2 + 9 - 8 = 4

이렇게 zip을 활용하여 여러 리스트의 요소들을 간단하게 연산할 수 있다.

numpy 모듈

numpy 모듈에 multiply 함수를 이용해서 두 리스트 사이에 연산을 수행할 수 있다.
다음 함수를 이용하여 add(), substract(), multiply(), divide() 각각 더하기, 빼기, 곱하기, 나누기를 수행할 수 있다.

import numpy

a = numpy.array([1, 2, 3])
b = numpy.array([4, 5, 6])

# add
print(a + b)
#[5 7 9]

# substract
print(numpy.subtract(a, b))
#[-3 -3 -3]

# multiply
print(numpy.multiply(a, b))
#[ 4 10 18]

# divide
print(numpy.divide(a, b))
#[0.25 0.4  0.5 ]

이 외에도 numpy를 이용한 다양한 리스트 연산은 공식 사이트나 여러 블로그들을 참고하기 바랍니다.

 

내장 함수 map

map 함수는 숫자형 문자열을 입력받을 때 주로 사용했을 텐데 리스트 연산으로도 사용할 수 있습니다.
map(function, iterable) 형태로, iterable에는 꼼마(,)로 여러 개의 iterable 즉 튜플이나 리스트가 자리할 수 있습니다.

a = [1, 2, 3]
b = [4, 5, 6]

print(list(map(lambda x, y: x*y, a, b)))
#[4, 10, 18]

2차원 리스트

zip 함수 때와 마찬가지로 2차원 배열에서는 for문을 이용하여 각 리스트를 돌아가며 연산한다.

a = [[1, 2], [3, 4]]
b = [[5, 6], [7, 8]]
result = []

for i in range(len(a)):
    result.append(list(map(lambda x, y: x*y, a[i], b[i])))

print(result)
#[[5, 12], [21, 32]]

💡궁금한 사항이나 문제점 있으면 주저 말고 댓글 달아주세요! 읽어주셔서 감사합니다.

REFERENCE