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

广播NumPy

La difusión de NumPy se aplica principalmente durante las operaciones aritméticas de NumPy para manejar arrays con diferentes formas. Debido a ciertas restricciones, el array más pequeño se difunde sobre el array más grande para que tengan formas compatibles.
Las operaciones de NumPy se realizan generalmente elemento a elemento en pares de arrays. En el caso más simple, dos arrays deben tener la misma forma, como se muestra en el siguiente ejemplo:

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

cuando los operandos en la operación 2 cuando las formas de varios arrays son diferentes, numpy activa automáticamente el mecanismo de difusión. Por ejemplo:

 >>> import numpy as np
 >>> a = np.array([[ 0, 0, 0],
            [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]]

La siguiente imagen muestra cómo el array b se difunde para coincidir con el array a.

4x3 Un array bidimensional con una longitud de 3 La suma de un array unidimensional equivalente a repetir el array b en dos dimensiones 4 Reoperación adicional:

 >>> import numpy as np
 >>> a = np.array([[ 0, 0, 0],
            [10,10,10],
            [20,20,20],
            [30,30,30]])
 >>> b = np.array([1,2,3))
 >>> bb = np.tile(b, (4, 1)) # Repetir las dimensiones de b
 >>> print(a + bb)
 [[ 1 2 3]]
  [11 12 13]]
  [21 22 23]]
  [31 32 33]]

Reglas de difusión general

Al ejecutarse en dos arrays, NumPy compara sus formas elemento a elemento. Comienza por la dimensión de seguimiento y avanza hacia adelante. Las dimensiones son compatibles cuando

son iguales o
uno de los cuales es1

Si no se cumplen estas condiciones, se lanza la excepción ValueError: los operandos no pudieron difundirse juntos, lo que indica que los arrays tienen formas incompatibles. El tamaño del array resultante es que en cada eje de entrada no es1de tamaño.

El array no necesita tener el mismo número de dimensiones. Por ejemplo, si tiene256x256x3Un array de valores RGB, y desea escalar diferentes valores para cada color en la imagen, puede multiplicar la imagen por un array con3Un array unidimensional de un valor. Según las reglas de difusión, se ordenan los tamaños de las últimas dimensiones de estos arrays, lo que indica que son compatibles:

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

cuando cualquier dimensión comparada es1al usar otra dimensión. En otras palabras, el tamaño de1El tamaño se estira o "copia" para coincidir con otro tamaño. En el siguiente ejemplo, los arrays A y B tienen una longitud de1El eje de, se expande a un tamaño mayor durante la operación de difusión:

 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 continuación se presentan algunos ejemplos:

 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 continuación se muestra un ejemplo de forma no difundida:

 A(1d(array): 3
 B(1d(array): 4 #Las dimensiones posteriores no coinciden
 A(2d(array): 2 x 1
 B(3d(array): 8 x 4 x 3 #La última dimensión no coincide

un ejemplo práctico de broadcast:

 >>> 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: Los operandos no pudieron ser broadcast juntos con formas (4,) (5,)
 >>> (xx
 (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.]])

La broadcast proporciona una manera conveniente de obtener el producto exterior (u otra operación externa) de dos arrays. A continuación se muestra un ejemplo de dos1-operación de producto exterior de array 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.]])

aquí newaxisoperador de índice inserta un eje nuevo a ,hágalo bidimensional 4x1matriz。Para hacer que 4x1matriz con forma (3,)de bcombinación,para generar un 4x3matriz.