np.tile, np.meshgrid, np.where resumen de aprendizaje
Recientemente, me encontré con varios usos de numpy cuando estaba mirando el código. Los resumiré y registraré aquí, de la manera más concisa posible. Mi último artículo sobre el uso de numpy es: python numpy learning summary
PD : Los siguientes sitios web oficiales corresponden a numpy1. Versión 17
一 、 numpy.tile ()
En primer lugar, azulejo significa baldosas, lo que significa baldosas, por lo que esta función es expandir y difundir la matriz np.ndarray como baldosas y baldosas una por una.
numpy.tile (A, repeticiones)
- La matriz de entrada A, reps especifica el múltiplo de expansión del eje a lo largo de cada eje de A, la dimensión de la matriz de salida es
max(d, A.ndim)
, donded
es la longitud de las repeticiones - Cuando
d
elA.ndim
tiempo no es igual a la dimensión, la dimensión más pequeña coloca uno delante de la dimensión de inserción, un valor de 1, y luego al eje final A a lo largo de un primer eje, correspondiente a un valor correspondiente a extender dentro del eje de repeticiones, y Nota: Esta no es una repetición de una sola fila y una sola columna, sino una expansión general. Puede aprender de numpy.repeat
>>> a = np.array([0, 1, 2])
>>>> np.tile(a, 2)
array([0, 1, 2, 0, 1, 2])
>>> np.tile(a, (2, 3)) # 先把[0,1,2]升维成[[0,1,2]]
array([[0, 1, 2, 0, 1, 2, 0, 1, 2],
[0, 1, 2, 0, 1, 2, 0, 1, 2]])
>>> np.tile(a, (2, 1, 3))
array([[[0, 1, 2, 0, 1, 2, 0, 1, 2]],
[[0, 1, 2, 0, 1, 2, 0, 1, 2]]])
>>> b = np.array([[1, 2], [3, 4]])
>>> np.tile(b, (2, 1))
array([[1, 2],
[3, 4],
[1, 2],
[3, 4]])
# 注意不是下面的这个结果,即上面红色字体提示:
# array([[1, 2],
# [1, 2],
# [3, 3],
# [3, 4]])
El sitio web oficial recomienda encarecidamente utilizar numpy.broadcast_to para la transmisión.
二 、 numpy.meshgrid ()
numpy.meshgrid (* xi, ** kwargs)
- La entrada es una matriz 1-D: x1, x2, ..., xn. Hay varios puntos finales de la cuadrícula que son de varias dimensiones. Generalmente, ingresamos xey, por lo que la cuadrícula generada es un plano bidimensional.
- Hay algunos parámetros opcionales, como indexación: sistema de coordenadas {'xy', 'ij'}
In the 2-D case with inputs of length M and N, the outputs are of shape (N, M) for ‘xy’ indexing and (M, N) for ‘ij’ indexing
, es decir , el orden de índice devuelto será diferente, disperso: bool, copia: bool
>>> nx = 5
>>> ny = 3
>>> x = np.arange(nx) - (nx - 1) / 2
>>> x
array([-2., -1., 0., 1., 2.])
>>> y = np.arange(ny) - (ny - 1) / 2
>>> y
array([-1., 0., 1.])
>>> xv, yv = np.meshgrid(x, y) #默认indexing='xy',所以输入(5,3),输出(3,5)
>>> xv
array([[-2., -1., 0., 1., 2.],
[-2., -1., 0., 1., 2.],
[-2., -1., 0., 1., 2.]])
>>> yv
array([[-1., -1., -1., -1., -1.],
[ 0., 0., 0., 0., 0.],
[ 1., 1., 1., 1., 1.]])
>>> xv, yv = np.meshgrid(x, y, sparse=True) # make sparse output arrays
>>> xv
array([[-2., -1., 0., 1., 2.]])
>>> yv
array([[-1.],
[ 0.],
[ 1.]])
>>> xv, yv = np.meshgrid(x, y, indexing='ij')
>>> xv
array([[-2., -2., -2.],
[-1., -1., -1.],
[ 0., 0., 0.],
[ 1., 1., 1.],
[ 2., 2., 2.]])
>>> yv
array([[-1., 0., 1.],
[-1., 0., 1.],
[-1., 0., 1.],
[-1., 0., 1.],
[-1., 0., 1.]])
Para el caso de 2-D, la memoria puede ser así: ahora de acuerdo con la entrada se deriva la forma de la salida, y luego x se llena línea por línea, y se agrega y columna por columna en orden.
Tres, numpy.where ()
- Ingrese la condición, si es verdadera, devuelva x; de lo contrario, devuelva y. condición, x, y debe poder transmitirse con la misma forma
- Pero cuando solo hay una condición de parámetro de entrada, el uso de la función como numpy.nonzero
se puede dividir en dos situaciones: 1) Cuando se dan los tres parámetros de condición, x, y; 2) Solo un parámetro de condición es Dado En ese momento, discutiré la situación en las siguientes situaciones:
Situación 1 Lo recordé así: los conceptos básicos unidimensionales no se satisfacen uno por uno, o es simple; en situaciones multidimensionales, generalmente condición, x, y tienen la misma forma, entonces en cuanto a elementos La condición de control de, también devuelve el valor en la posición correspondiente, si la condición es verdadera, devuelve el valor en la posición anterior correspondiente, y si la condición es falsa, devuelve el valor en la posición correspondiente en la parte posterior
# 情况 1)
# [xv if c else yv
# for c, xv, yv in zip(condition, x, y)] 对于所有数组都是1-D的时候
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.where(a < 5, a, 10*a)
array([ 0, 1, 2, 3, 4, 50, 60, 70, 80, 90])
>>> np.where([[True, False], [True, True]],
... [[1, 2], [3, 4]],
... [[9, 8], [7, 6]])
array([[1, 8],
[3, 4]])
Caso 2 Cuando el parámetro de entrada es solo condición, se devuelve el índice del elemento que satisface la condición (es decir, distinto de cero) y se devuelve como una tupla. Debido a que el índice se devuelve, cuando la condición de entrada tiene N dimensiones, la longitud de la tupla devuelta también es Is N, mira el ejemplo
# 情况 2)
>>> np.where(a > 5)
(array([3, 4], dtype=int64),)
>>> a[np.where(a > 5)]
array([6, 7])
>>> a = np.arange(8).reshape(2,2,2)
>>> a
array([[[0, 1],
[2, 3]],
[[4, 5],
[6, 7]]])
>>> np.where(a > 4)
(array([1, 1, 1], dtype=int64),
array([0, 1, 1], dtype=int64),
array([1, 0, 1], dtype=int64))
# 返回的第一列[1,0,1]位置就是5,第二列[1,1,0]就是6的位置
# 第三列[1,1,1]就是7的位置,所以就是满足条件(非零)的索引