English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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]]
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배열。