Python의 벡터화 및 브로드캐스팅
게시 됨: 2020-12-01벡터화 및 브로드캐스팅은 Numpy로 수학 연산을 수행하는 동안 계산 시간을 단축하고 메모리 사용을 최적화하는 방법입니다. 이러한 방법은 알고리즘이 병목 현상에 직면하지 않도록 시간 복잡성을 줄이는 데 중요합니다. 이 최적화된 작업은 응용 프로그램을 확장하는 데 필요합니다. 우리는 이 두 가지 기술을 모두 살펴보고 몇 가지 예를 구현할 것입니다.
이 튜토리얼을 마치면 다음에 대한 지식을 갖게 될 것입니다.
- Numpy에서 벡터화를 처리하는 방법
- 벡터화 유무에 따른 시차
- 방송이란
- 방송이 일반적인 행렬 곱셈과 다른 점
벡터화
배열 곱셈과 같은 배열에 대한 수학 연산이 필요한 경우가 많습니다. 이제 벡터화되지 않은 방법은 루프를 사용하여 요소별 곱셈을 수행하는 것입니다. 이러한 방식으로 구현하면 동일한 곱셈 연산이 여러 번 수행되어 데이터 크기가 너무 큰 경우 컴퓨팅 리소스가 낭비됩니다. 간단히 살펴보겠습니다.
벡터화되지 않은 방법:
무작위 가져오기 a = [random.randint( 1 , 100 ) for _ in range( 10000 )] |
#산출: >> 1000 개 루프, 최고 3개 : 루프당 658 µs |
벡터화 방법:
numpy 를 np 로 가져오기 a = np.array([random.randint( 1 , 100 ) for _ in range( 10000 )]) b = np.array([random.randint( 1 , 100 ) for _ in range( 10000 )]) %timeit a*b |
#산출: >> 100000 루프, 최고 3 : 루프당 7.25 µs |
보시는 바와 같이 경과 시간은 658마이크로초에서 7.25마이크로초로 단축되었습니다. 이는 a = np.array([]) 라고 말할 때 모든 작업이 numpy에 의해 내부적으로 처리되기 때문입니다. 그리고 a*b 를 수행할 때 numpy는 내부적으로 벡터화를 통해 전체 배열을 한 번에 곱합니다.
여기에서 %timeit 매직 명령을 사용하여 시스템에서 다를 수 있는 프로세스 실행 시간을 정합니다.
차원이 (nx1) 및 (1xm)인 두 벡터의 외적의 다른 예를 살펴보겠습니다. 출력은 (nxm)입니다.
가져오기 시간 수입 numpy 배열 가져오기 a = array.array( 'i' , [random.randint( 1 , 100 ) for _ in range( 100 )]) b = array.array( 'i' , [random.randint( 1 , 100 ) for _ in range( 100 )]) |
T1 = time.process_time() c = numpy.zeros(( 200 , 200 )) 범위(len(a))의 i 에 대해 : 범위(len(b)) 의 j 에 대해 : c[i][j]= a[i]*b[j] T2 = time.process_time() print( f”계산 시간 = { 1000 *(T2-T1)} ms” ) |
#산출: >> 계산 시간 = 6.819299000000001ms |
이제 Numpy로 해보자.
T1 = time.process_time() c = numpy.outer(a, b) T2 = time.process_time() print( f”계산 시간 = { 1000 *(T2-T1)} ms” ) |
#산출: >> 계산 시간 = 0.2256630000001536ms |
다시 보듯이 Numpy는 벡터화를 통해 동일한 작업을 더 빠르게 처리합니다.
필독: 실세계의 매혹적인 Python 응용 프로그램
그래서 지금까지 같은 크기의 배열이 사용된 예를 보았습니다. 배열의 크기가 다른 경우에는 어떻게 합니까? Numpy의 또 다른 훌륭한 기능인 Broadcasting이 여기에 있습니다.
브로드캐스팅은 덧셈, 뺄셈, 곱셈 등과 같은 연산을 수행하기 위해 배열이 같은 크기일 필요가 없는 벡터화의 또 다른 확장입니다. 배열과 스칼라를 더하는 매우 간단한 예를 통해 이것을 이해합시다.

a = np.array([ 1 , 1 , 1 , 1 ]) + 5 |
#산출: 배열([ 6 , 6 , 6 , 6 ]) |
보시다시피 스칼라 5가 모든 요소에 추가되었습니다. 어떻게 된 건가요?
그 과정을 상상해보면, 스칼라 5를 4번 반복하여 배열을 만든 다음 배열 a에 추가한다고 생각할 수 있습니다. 그러나 Numpy는 메모리만 차지하는 배열을 생성하지 않는다는 점을 명심하십시오. Numpy는 배열에 추가하기 위해 스칼라 5를 최대 4개까지 "브로드캐스트"하거나 복제합니다.
또 다른 쉬운 예를 들어보겠습니다.
a = np.ones(( 3 , 3 )) b = np.ones( 3 ) a+b |
#산출: >> 배열([[ 2. , 2. , 2. ], [ 2. , 2. , 2. ], [ 2. , 2. , 2. ]]]) |
위의 예에서 모양 (3,1)의 배열은 배열 a와 일치하도록 (3,3)으로 브로드캐스트되었습니다.
그러나 이것은 모든 차원의 배열을 모든 차원의 배열과 일치하도록 브로드캐스트할 수 있음을 의미합니까?
아니요!
방송 규칙
Numpy는 기준을 따르는 배열만 브로드캐스트되도록 하기 위해 일련의 쉬운 규칙을 따릅니다. 한 번 보자.
브로드캐스팅의 규칙에 따르면 작동할 2개의 어레이는 동일한 차원을 가지거나 둘 중 하나가 1인 경우에 하나여야 합니다.
이것이 실제로 작동하는지 봅시다.
예 1:
아래 차원 배열을 고려하십시오.
에이 = 3 x 4 x 7
b = 3 x 4 x 1
여기서 b의 마지막 차원은 ~ 7과 일치하도록 방송됩니다.
따라서 결과 = 3 x 4 x 7
예 2:
에이 = 3 x 4 x 7
b = 4
이제 a와 b의 차원 수가 같지 않습니다. 이러한 경우 차원 수가 적은 배열은 1로 채워집니다.
따라서 여기서 b의 첫 번째 및 마지막 차원은 1이므로 3과 7에 맞게 방송됩니다.
따라서 결과 = 3 x 4 x 7입니다.
읽기: Python 자습서
예 3:
에이 = 3 x 4 x 1 x 5
b = 3 x 1 x 7 x 1
여기서도 b의 2차원과 마지막 차원은 4차원과 5차원에 맞게 방송될 것이다. 또한 3차원은 b와 7에 맞춰 방송된다.
따라서 결과 = 3 x 4 x 7 x 5
이제 조건이 실패할 때를 보겠습니다.
예 4:
a = 3 x 4 x 7 x 5
b = 3 x 3 x 7 x 4
여기에서 b의 두 번째 및 네 번째 차원은 와 일치하지 않으며 둘 다 1도 아닙니다. 이 경우 Python은 값 오류를 발생시킵니다.
ValueError: 피연산자는 모양( 3 , 4 , 7 , 5 ) ( 3 , 3 , 7 , 4 ) 과 함께 브로드캐스트 할 수 없습니다 . |
예 5:
에이 = 3 x 4 x 1 x 5
b = 3 x 2 x 3
결과: 값 오류
여기에서도 두 번째 차원은 일치하지 않으며 둘 다 1도 아닙니다.
가기 전에
벡터화와 브로드캐스팅은 둘 다 Numpy가 처리를 최적화하고 효율적으로 만드는 방법입니다. 이러한 개념은 특히 이미지 데이터와 신경망에서 매우 일반적인 행렬과 n차원 배열을 다룰 때 염두에 두어야 합니다.
python, 데이터 과학에 대해 자세히 알고 싶으시면 작업 전문가를 위해 만들어졌으며 10개 이상의 사례 연구 및 프로젝트, 실용적인 실습 워크샵, 업계 전문가와의 멘토링, 업계 멘토와의 1:1 학습, 400시간 이상의 학습 및 최고의 기업과의 취업 지원.
파이썬에서 벡터화란 무엇입니까?
Numpy는 벡터화를 포함하여 루프 없이도 대규모 데이터 배열에 대한 신속한 연산을 가능하게 하는 여러 표준 수학 함수를 제공하는 Python 패키지입니다. 벡터화는 루프를 사용하지 않고 Python 프로그램을 가속화하는 데 사용됩니다. 이러한 방법을 사용하면 코드를 실행하는 데 걸리는 시간을 줄이는 데 도움이 될 수 있습니다. 벡터의 내적과 같이 벡터에 대해 수행되는 다양한 연산이 있습니다. 단일 출력인 외적을 생성하기 때문에 스칼라 곱이라고도 하며, 결과적으로 길이 x 길이와 같은 차원의 정방 행렬이 생성됩니다. 벡터, 동일한 인덱스를 가진 요소를 생성하는 요소별 곱셈.
파이썬에서 브로드캐스팅이란?
브로드캐스팅이라는 단어는 Numpy가 특정 제한을 초래하는 산술 연산 중에 차원이 다른 배열을 관리하는 방법을 나타냅니다. 더 작은 배열은 형태가 일관되도록 거대한 배열에 브로드캐스트됩니다. 브로드캐스팅을 사용하면 Numpy가 하는 것처럼 Python이 아닌 C에서 반복이 발생하도록 배열 작업을 벡터화할 수 있습니다. 불필요한 데이터 복사본을 생성하지 않고 이를 수행하므로 효율적인 알고리즘 구현이 가능합니다. 특정 상황에서 브로드캐스팅은 낭비되는 메모리 소비를 초래하여 처리 속도를 늦추기 때문에 부정적인 생각입니다.
Python에서 NumPy의 용도는 무엇입니까?
NumPy 또는 Numerical Python은 거의 모든 연구 및 엔지니어링 부서에서 사용하는 무료 오픈 소스 Python 라이브러리입니다. NumPy 라이브러리는 다차원 배열 및 행렬 데이터 구조를 포함하며 동종 n차원 배열 객체인 배열에서 효율적으로 작동하는 방법을 제공합니다. 사용자는 NumPy를 사용하여 배열에서 광범위한 수학 연산을 실행할 수 있습니다. 배열과 행렬로 효율적인 계산을 제공하는 강력한 데이터 구조와 이러한 배열과 행렬에서 작동하는 고수준 수학 함수의 방대한 라이브러리로 Python을 향상시킵니다.