English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

NumPy 브로드캐스트

NumPy 广播主要应用numpy在算术运算期间处理具有不同形状的数组。受某些约束的影响,较小的数组在较大的数组上“广播”,以便它们具有兼容的形状。
NumPy 操作通常在数组对上逐个元素的基础上完成。在最简单的情况下,两个数组必须具有完全相同的形状,如下例所示:

 >>> import numpy as np
 >>> a = np.array([1, 2, 3))
 >>> b = np.array([2, 2, 2))
 >>> a * b
 array([ 2, 4, 6))

当运算中的 2 수组的形状不同时,numpy 将自动触发广播机制。如:

 >>> import numpy as np
 >>> a = np.array([
            [10,10,10],
            [20,20,20],
            [30,30,30]])
 >>> b = np.array([1,2,3))
 >>> print(a + b)
 [[ 1 2 3]]
  [11 12 13]]
  [21 22 23]]
  [31 32 33]]

아래의 그림은 배열 b가 어떻게 배열 a와 호환되는지 보여줍니다.

4x3 의 두 차원 배열과 길이가 3 일维 배열을 더하면, 배열 b를 두 차원에서 반복하는 것과 동일합니다. 4 다시 계산:

 >>> import numpy as np
 >>> a = np.array([
            [10,10,10],
            [20,20,20],
            [30,30,30]])
 >>> b = np.array([1,2,3))
 >>> bb = np.tile(b, (4, 1)) # b의 각 차원을 반복
 >>> print(a + bb)
 [[ 1 2 3]]
  [11 12 13]]
  [21 22 23]]
  [31 32 33]]

일반 broadcast 규칙

NumPy는 두 배열에 대해 차원을 비교할 때, 두 배열에 대해 차원을 비교합니다. 그들은 끝 차원에서 시작하여 앞으로 진행합니다. 두 차원이 호환되면

또는 그들은 동일합니다.
중 하나는1

이 조건을 만족하지 않으면 ValueError: operands could not be broadcast together 예외가 발생하며, 입력의 각 축에서 입력 배열의 크기가 아닌1의 크기입니다.

배열은 동일한 수의 차원을 가지지 않아도 됩니다. 예를 들어, 당신이256x256x3RGB 값 배열이며, 이미지 중每种颜色을 다른 값으로 줄이고 싶다면, 배열을 가진 이미지를 곱할 수 있습니다3단위의 값을 가진 원소 한 개의 일维 배열입니다. 이 배열들의 끝 차원 크기를广播 규칙에 따라 정렬하여, 그들이 호환된다는 것을 나타냅니다:

 Image (3d array): 256 x 256 x 3
 Scale (1d array): 3
 Result (3d array): 256 x 256 x 3

当一个尺寸被比较为1이면 다른 크기로 사용됩니다. 다시 말해, 크기가1의 크기는 늘려지거나 또는 "複사"되어 다른 크기와 일치하게 됩니다. 다음 예제에서, A와 B 배열은 길이가1의 축은 브로드캐스트 작업 중 더 큰 크기로 확장됩니다:

 A (4d array): 8 x 1 x 6 x 1
 B (3d array): 7 x 1 x 5
 Result (4d array): 8 x 7 x 6 x 5

다음은 몇 가지 예제입니다:

 A (2d array): 5 x 4
 B (1d array): 1
 Result (2d array): 5 x 4
 A (2d array): 5 x 4
 B (1d array): 4
 Result (2d array): 5 x 4
 A (3d array): 15 x 3 x 5
 B (3d array): 15 x 1 x 5
 Result (3d array): 15 x 3 x 5
 A (3d array): 15 x 3 x 5
 B (2d array): 3 x 5
 Result (3d array): 15 x 3 x 5
 A (3d array): 15 x 3 x 5
 B (2d array): 3 x 1
 Result (3d array): 15 x 3 x 5

다음은 브로드캐스트되지 않는 형상 예제입니다:

 A (1d array): 3
 B (1d array): 4 # trailing dimensions do not match
 A (2d array): 2 x 1
 B (3d array): 8 x 4 x 3 #뒤죽죽한 차원 불일치

브로드캐스트의 실제 예제:}

 >>> import numpy as np
 >>> x = np.arange(4)
 >>> xx = x.reshape(4,1)
 >>> y = np.ones(5)
 >>> z = np.ones(3,4))
 >>> x.shape
 (4,)
 >>> y.shape
 (5,)
 >>> x + y
 ValueError: operands could not be broadcast together with shapes (4,) (5,)
 >>> xx.shape
 (4, 1)
 >>> y.shape
 (5,)
 >>> (xx + y).shape
 (4, 5)
 >>> xx + y
 array([[ 1., 1., 1., 1., 1.],
        [ 2., 2., 2., 2., 2.],
        [ 3., 3., 3., 3., 3.],
        [ 4., 4., 4., 4., 4.]])
 >>> x.shape
 (4,)
 >>> z.shape
 (3, 4)
 >>> (x + z).shape
 (3, 4)
 >>> x + z
 array([[ 1., 2., 3., 4.],
        [ 1., 2., 3., 4.],
        [ 1., 2., 3., 4.]])

브로드캐스트는 두 배열의 외적(또는 다른 어떤 외부 연산)을 쉽게 얻을 수 있는 방법을 제공합니다. 다음 예제는 두1-d 배열의 외적 연산:

 >>> import numpy as np
 >>> a = np.array([0.0, 10.0, 20.0, 30.0])
 >>> b = np.array([1.0, 2.0, 3.0])
 >>> a[:, np.newaxis] + b
 array([[ 1., 2., 3.],
        [ 11., 12., 13.],
        [ 21., 22., 23.],
        [ 31., 32., 33.]])

여기 newaxis인덱스 연산자를 새로운 축으로 삽입합니다 a 를 두차원으로 만듭니다 4x1배열을 사용하여 4x1배열과 형태가 (3,)b결합하여 하나의 4x3배열。