6.8. 연산자

numpyndarray 에 대해 실행하는 첫 번째 종류의 수학은 표준 Python 연산자입니다. 산술, 비교, 비트 연산자는 모두 요소별로 작동합니다 – 각 연산자는 단일 라이브러리 호출 안에서 배열(또는 두 배열)을 처음부터 끝까지 한 번 따라가며, 동등한 Python for 루프보다 훨씬 빠릅니다.

6.8.1. 산술

+, -, *, /, //, %, ** 는 모두 호환되는 형태의 두 배열 사이, 또는 배열과 스칼라 사이에서 작동합니다:

a = np.array([1, 2, 3, 4], dtype=np.float)
b = np.array([10, 20, 30, 40], dtype=np.float)

print(a + b)        # array([11.0, 22.0, 33.0, 44.0])
print(a * 2)        # array([2.0, 4.0, 6.0, 8.0])
print(b - a)        # array([9.0, 18.0, 27.0, 36.0])
print(b / a)        # array([10.0, 10.0, 10.0, 10.0])

결과 dtype은 Dtype 에 설명된 상향 변환 규칙을 따릅니다. 정수 배열은 오버플로 시 래핑됩니다. 그것이 중요할 때는 연산 전에 더 넓은 dtype으로 캐스팅하십시오.

행렬 곱셈 연산자 @ 는 구현되어 있지 않습니다. 행렬/벡터 곱에는 dot() 을 사용하십시오.

6.8.1.1. 제자리(in-place) 형식

모든 산술 연산자는 제자리 형식을 가집니다 – +=, -=, *=, /=, %=, **=. 제자리 형식은 임시 버퍼를 할당하는 대신 기존 버퍼를 통해 기록합니다:

b = b + 1            # allocates a temporary the size of b
b += 1               # no temporary

마이크로컨트롤러에서는 어떤 핫 루프에서든 두 번째 형식이 본질적으로 필수입니다.

6.8.2. 비트 연산

비트 연산자 &, |, ^ 는 정수 배열에 요소별로 작동합니다. float 또는 complex 배열에 적용하면 TypeError 를 발생시킵니다:

a = np.array([0b1100, 0b1010], dtype=np.uint8)
b = np.array([0b1010, 0b1100], dtype=np.uint8)
print(a & b)        # array([8, 8], dtype=uint8)
print(a | b)        # array([14, 14], dtype=uint8)
print(a ^ b)        # array([6, 6], dtype=uint8)

단항 ~ 는 정수 배열에 대해 비트 NOT을 수행합니다.

시프트 연산자 <<>> 는 Python 연산자 수준에서 연결되어 있지 않습니다. 함수 형식 left_shift()right_shift() 는 작동합니다:

np.left_shift(a, 2)
np.right_shift(b, 1)

6.8.3. 비교

==, !=, <, <=, >, >= 는 모두 브로드캐스트 형태의 bool ndarray 를 반환합니다:

a = np.array([1, 2, 3, 4, 5], dtype=np.uint8)
print(a < 3)
# array([True, True, False, False, False], dtype=bool)

이 불리언 결과는 정확히 인덱싱선택과 재배열 이 소비하는 것입니다.

6.8.3.1. 측면 규칙

ndarray 는 스칼라와 비교할 때 관계 연산자의 왼쪽 에 있어야 합니다. a > 2 는 작동하지만 2 < aTypeError 를 발생시킵니다. 대칭 형식을 위해서는 함수 이름을 사용하십시오:

np.greater(5, a)        # 5 > a, element-wise
np.less(5, a)           # 5 < a, element-wise
np.equal(5, a)          # 5 == a, element-wise
np.not_equal(5, a)      # 5 != a, element-wise

6.8.4. 단항 연산자

  • +a – 배열의 사본을 반환합니다.

  • -a – 부정. 부호 없는 dtype에서는 값이 이항 연산자와 동일한 방식으로 \(2^N\) 으로 나눈 나머지로 래핑됩니다.

  • abs(a) – 요소별 절댓값. 부호 없는 dtype에서는 계산 없이 사본을 반환합니다.

  • ~a – 비트 반전(정수 배열만 해당).

  • len(a)첫 번째 축의 길이를 반환하며, 이는 Python 시퀀스 관례와 일치합니다.

6.8.5. 빠진 것

비교 및 일부 비트 연산을 위한 우변 연산자는 산술 연산자와 같은 방식으로 구현되어 있지 않습니다. ndarray 가 우변에 오게 될 때는 (위의) 함수 형식을 사용하십시오.

지원되는 연산자의 완전한 목록과 그것들이 따르는 상향 변환에 대해서는 numpy — numpy 호환 배열 연산 를 참조하십시오.