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

运算位NumPy

La difusión de NumPy se aplica principalmente durante las operaciones aritméticas para manejar arrays con diferentes formas. Debido a ciertas restricciones, el array más pequeño se difunde en 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 el operando en 2 cuando las formas de diferentes 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 ser compatible con el array a.

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

 >>> 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 generales de difusión

Al ejecutarse en dos arrays, NumPy compara sus formas elemento a elemento. Comienza por el tamaño final 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: operands could not be broadcast together, lo que indica que los arrays tienen formas incompatibles. El tamaño del array resultante es que en cada eje de entrada no1de tamaño.

El array no necesita tener el mismo número de dimensiones. Por ejemplo, si tiene256x256x3Un array de valores RGB, y desea escalar cada color con diferentes valores, 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 del eje final 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 de la comparación es1al usar otra dimensión. En otras palabras, el tamaño es1El 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, 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 #La dimensión final no coincide
 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 difusión:}

 >>> 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 se pudieron difundir juntos con formas (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.]])

La difusión proporciona una manera conveniente de obtener el producto exterior (u otra operación externa) de dos matrices. A continuación se muestra un ejemplo de dos1-operación de producto exterior de matrices 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 ,haciéndola bidimensional 4x1matriz。Hacer 4x1matriz con forma (3,)de bcombinación,que produce un 4x3matriz.