Procesamiento de datos de Python (tutorial introductorio)

crear y generar

Esta sección presenta principalmente la creación y generación de arreglos. ¿Por qué poner esto en la parte superior? Hay dos razones principales:

En primer lugar, en el proceso de trabajo real, necesitamos verificar o ver la interoperabilidad o la API relacionada con la matriz de vez en cuando. Al mismo tiempo, a veces, cuando se usan herramientas como sklearn, matplotlib, PyTorch, Tensorflow, etc., se necesitan algunos datos simples para la experimentación.

Por lo tanto, hay muchos beneficios en aprender cómo obtener rápidamente una matriz primero. En esta sección, presentamos principalmente los siguientes métodos comunes de creación:

  • Usar una lista o tupla

  • usar un rango

  • Usar espacio de línea/espacio de registro

  • 使用 unos/ceros

  • uso aleatorio

  • leer del archivo

Entre ellos, los más utilizados son linspace/logspace y random.El primero se suele utilizar para dibujar ejes de coordenadas, y el segundo se utiliza para generar "datos de simulación". Por ejemplo, cuando necesitamos dibujar una imagen de una función, X a menudo se genera usando linspace, luego Y se obtiene usando la fórmula de la función y luego se grafica; cuando necesitamos construir alguna entrada (como X) o una entrada intermedia ( como incrustación, estado oculto), aleatorio es muy conveniente.

Crear desde la lista de python o tupla

⭐⭐ Concéntrese en dominar la lista entrante para crear una matriz:np.array(list)

⚠️ Nota: "Tipo de datos". Si es lo suficientemente cuidadoso, puede encontrar que el segundo número en el segundo conjunto de códigos a continuación es un "decimal" (Nota: 1. == 1.0 en Python), y la matriz es para garantizar que cada elemento tenga el mismo tipo, por lo que lo ayudará a convertir la matriz en un tipo flotante.

# 一个 list
np.array([1,2,3])
array([1, 2, 3])
# 二维(多维类似)
# 注意,有一个小数哦
np.array([[1, 2., 3], [4, 5, 6]])
array([[1., 2., 3.],
       [4., 5., 6.]])
# 您也可以指定数据类型
np.array([1, 2, 3], dtype=np.float16)
array([1., 2., 3.], dtype=float16)
# 如果指定了 dtype,输入的值都会被转为对应的类型,而且不会四舍五入
lst = [
    [1, 2, 3],
    [4, 5, 6.8]
]
np.array(lst, dtype=np.int32)
array([[1, 2, 3],
       [4, 5, 6]], dtype=int32)

# 一个 tuple
np.array((1.1, 2.2))
array([1.1, 2.2])
# tuple,一般用 list 就好,不需要使用 tuple
np.array([(1.1, 2.2, 3.3), (4.4, 5.5, 6.6)])
array([[1.1, 2.2, 3.3],
       [4.4, 5.5, 6.6]])
# 转换而不是上面的创建,其实是类似的,无须过于纠结
np.asarray((1,2,3))
array([1, 2, 3])
np.asarray(([1., 2., 3.], (4., 5., 6.)))
array([[1., 2., 3.],
       [4., 5., 6.]])

Generado usando un rango

⭐⭐

range es un generador de secuencias de enteros integrado en Python, y arange es numpy, que tiene un efecto similar y genera un vector unidimensional. Ocasionalmente necesitamos usar este método para construir matrices, como:

  • Necesidad de crear un vector unidimensional continuo como entrada (por ejemplo, se puede usar al codificar la posición)

  • Cuando necesita observar los resultados de la detección y el muestreo, las matrices ordenadas son generalmente más fáciles de observar.

⚠️ Cabe señalar que: en ese  reshape momento, la cantidad de elementos requerida por la forma objetivo debe ser igual a la cantidad original de elementos.

np.arange(12).reshape(3, 4)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
# 注意,是小数哦
np.arange(12.0).reshape(4, 3)
array([[ 0.,  1.,  2.],
       [ 3.,  4.,  5.],
       [ 6.,  7.,  8.],
       [ 9., 10., 11.]])
np.arange(100, 124, 2).reshape(3, 2, 2
 
 

matriz ([[[100, 102],
[104, 106]],

[[108, 110],
[112, 114]],

[[116, 118],
[120, 122]]])

# shape size 相乘要和生成的元素数量一致
np.arange(100., 124., 2).reshape(2,3,4)
 
 

-------------------------------------------------- -------------------------

Rastreo de ValueError (última llamada más reciente)

<ipython-input-20-fc850bf3c646> en <módulo>
---- > 1 np.arange(100., 124., 2).reshape(2,3,4)


ValueError: no se puede remodelar una matriz de tamaño 12 en forma (2,3,4)

Generado usando linspace/logspace

⭐⭐⭐

Bien, esta es la primera API importante que hemos encontrado. La primera necesita pasar 3 parámetros: el principio, el final y el número; la última necesita pasar una base adicional, que por defecto es 10.

⚠️ Nota: el tercer parámetro no el tamaño del paso.

np.linspace

# 线性
np.linspace(0, 9, 10).reshape(2, 5)
array([[0., 1., 2., 3., 4.],
       [5., 6., 7., 8., 9.]])
np.linspace(0, 9, 6).reshape(2, 3)
array([[0. , 1.8, 3.6],
       [5.4, 7.2, 9. ]])

# 指数 base 默认为 10
np.logspace(0, 9, 6, base=np.e).reshape(2, 3)
array([[1.00000000e+00, 6.04964746e+00, 3.65982344e+01],
       [2.21406416e+02, 1.33943076e+03, 8.10308393e+03]])
# _ 表示上(最近)一个输出
# logspace 结果 log 后就是上面 linspace 的结果
np.log(_)
array([[0. , 1.8, 3.6],
       [5.4, 7.2, 9. ]])

Miremos más de cerca:

N = 20
x = np.arange(N)
y1 = np.linspace(0, 10, N) * 100
y2 = np.logspace(0, 10, N, base=2)

plt.plot(x, y2, '*');
plt.plot(x, y1, 'o');

# 检查每个元素是否为 True
# base 的 指数为 linspace 得到的就是 logspace
np.alltrue(2 ** np.linspace(0, 10, N)  == y2)
True
⚠️ 补充:关于 array 的条件判断
# 不能直接用 if 判断 array 是否符合某个条件
arr = np.array([1, 2, 3])
cond1 = arr > 2
cond1
array([False, False,  True])
if cond1:
    print("这不行")
 
 

-------------------------------------------------- -------------------------

Rastreo de ValueError (última llamada más reciente)

<ipython-input-184-6bd8dc445309> en <módulo>
---- > 1 if cond1:
2 print("这不行")


ValueError: el valor de verdad de una matriz con más de un elemento es ambiguo. Use a.any() o a.all()

# 即便你全是 True 它也不行
arr = np.array([1, 2, 3])
cond2 = arr > 0
cond2
array([ True,  True,  True])
if cond2:
    print("这还不行")
 
 

-------------------------------------------------- -------------------------

ValueError Traceback (última llamada más reciente)

<ipython-input-187-7fedc8ba71a0> en <módulo>
---- > 1 if cond2:
2 print("这还不行")


ValueError: El valor de verdad de una matriz con más de un elemento es ambiguo. Use a.any() o a.all()

# 咱们只能用 any 或 all,这个很容易犯错,请务必注意。
if cond1.any():
    print("只要有一个为True就可以,所以——我可以")
只要有一个为True就可以,所以——我可以
if cond2.all():
    print("所有值为True才可以,我正好这样")
所有值为True才可以,我正好这样

Creado con unos/ceros

Atajo para crear una matriz de 1/0. Cabe señalar que los  dos pueden generar rápidamente un vector 0 np.zeros_like o  np.ones_like1 de la misma forma que la matriz dada, que puede usarse cuando se requieren ciertas posiciones de la máscara.

⚠️ Cabe señalar que la matriz creada es de tipo flotante por defecto.

np.ones(3)
array([1., 1., 1.])
np.ones((2, 3))
array([[1., 1., 1.],
       [1., 1., 1.]])
np.zeros((2,3,4))
array([[[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]],

       [[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]]])
# 像给定向量那样的 0 向量(ones_like 是 1 向量)
np.zeros_like(np.ones((2,3,3)))
array([[[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]],

       [[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]]])

Generado usando aleatorio

⭐⭐⭐⭐⭐

Si desea elegir una de las API más importantes en esta sección, debe ser  random sin duda. Aquí solo presentamos algunas de las API más utilizadas relacionadas con los datos de "producción". A menudo se utilizan para la generación aleatoria de datos de prueba o entrenamiento, inicialización de redes neuronales, etc.

⚠️ Cabe señalar que: aquí recomendamos uniformemente usar el nuevo método API para crear, es decir,  np.random.default_rng() primero  Generatorgenerando y luego generando varios datos distribuidos sobre esta base (la memoria es más fácil y clara). Sin embargo, seguiremos presentando el uso antiguo de la API, ya que mucho del código todavía se usa en el antiguo, puede mezclarlo.

# 0-1 连续均匀分布
np.random.rand(2, 3)
array([[0.42508994, 0.5842191 , 0.09248675],
       [0.656858  , 0.88171822, 0.81744539]])
# 单个数
np.random.rand()
0.29322641374172986
# 0-1 连续均匀分布
np.random.random((3, 2))
array([[0.17586271, 0.5061715 ],
       [0.14594537, 0.34365713],
       [0.28714656, 0.40508807]])
# 指定上下界的连续均匀分布
np.random.uniform(-1, 1, (2, 3))
array([[ 0.66638982, -0.65327069, -0.21787878],
       [-0.63552782,  0.51072282, -0.14968825]])
# 上面两个的区别是 shape 的输入方式不同,无伤大雅了
# 不过从 1.17 版本后推荐这样使用(以后大家可以用新的方法)
# rng 是个 Generator,可用于生成各种分布
rng = np.random.default_rng(42)
rng
Generator(PCG64) at 0x111B5C5E0
# 推荐的连续均匀分布用法
rng.random((2, 3))
array([[0.77395605, 0.43887844, 0.85859792],
       [0.69736803, 0.09417735, 0.97562235]])
# 可以指定上下界,所以更加推荐这种用法
rng.uniform(0, 1, (2, 3))
array([[0.47673156, 0.59702442, 0.63523558],
       [0.68631534, 0.77560864, 0.05803685]])
# 随机整数(离散均匀分布),不超过给定的值(10)
np.random.randint(10, size=2)
array([6, 3])
# 随机整数(离散均匀分布),指定上下界和 shape
np.random.randint(0, 10, (2, 3))
array([[8, 6, 1],
       [3, 8, 1]])
# 上面推荐的方法,指定大小和上界
rng.integers(10, size=2)
array([9, 7])
# 上面推荐的方法,指定上下界
rng.integers(0, 10, (2, 3))
array([[5, 9, 1],
       [8, 5, 7]])
# 标准正态分布
np.random.randn(2, 4)
array([[-0.61241167, -0.55218849, -0.50470617, -1.35613877],
       [-1.34665975, -0.74064846, -2.5181665 ,  0.66866357]])
# 上面推荐的标准正态分布用法
rng.standard_normal((2, 4))
array([[ 0.09130331,  1.06124845, -0.79376776, -0.7004211 ],
       [ 0.71545457,  1.24926923, -1.22117522,  1.23336317]])
# 高斯分布
np.random.normal(0, 1, (3, 5))
array([[ 0.30037773, -0.17462372,  0.23898533,  1.23235421,  0.90514996],
       [ 0.90269753, -0.5679421 ,  0.8769029 ,  0.81726869, -0.59442623],
       [ 0.31453468, -0.18190156, -2.95932929, -0.07164822, -0.23622439]])
# 上面推荐的高斯分布用法
rng.normal(0, 1, (3, 5))
array([[ 2.20602146, -2.17590933,  0.80605092, -1.75363919,  0.08712213],
       [ 0.33164095,  0.33921626,  0.45251278, -0.03281331, -0.74066207],
       [-0.61835785, -0.56459129,  0.37724436, -0.81295739,  0.12044035]])

En resumen, generalmente se utilizan dos distribuciones: distribución uniforme y distribución normal (gaussiana). Además, size se puede especificar la forma.

rng = np.random.default_rng(42)
# 离散均匀分布
rng.integers(low=0, high=10, size=5)
array([0, 7, 6, 4, 4])
# 连续均匀分布
rng.uniform(low=0, high=10, size=5)
array([6.97368029, 0.94177348, 9.75622352, 7.61139702, 7.86064305])
# 正态(高斯)分布
rng.normal(loc=0.0, scale=1.0, size=(2, 3))
array([[-0.01680116, -0.85304393,  0.87939797],
       [ 0.77779194,  0.0660307 ,  1.12724121]])

leer del archivo

Esta sección se usa principalmente para cargar e implementar parámetros de peso almacenados o conjuntos de datos preprocesados, lo que a veces es conveniente, como cargar parámetros de modelos entrenados en la memoria para proporcionar servicios de inferencia o preprocesar datos que toman mucho tiempo Almacénelos directamente y no necesita reprocesar para múltiples experimentos.

⚠️ Cabe señalar que: no necesita escribir el sufijo del nombre del archivo al almacenar, se agregará automáticamente.

# 直接将给定矩阵存为 a.npy
np.save('./data/a', np.array([[1, 2, 3], [4, 5, 6]]))
# 可以将多个矩阵存在一起,名为 `b.npz`
np.savez("./data/b", a=np.arange(12).reshape(3, 4), b=np.arange(12.).reshape(4, 3))
# 和上一个一样,只是压缩了
np.savez_compressed("./data/c", a=np.arange(12).reshape(3, 4), b=np.arange(12.).reshape(4, 3))
# 加载单个 array
np.load("data/a.npy")
array([[1, 2, 3],
       [4, 5, 6]])
# 加载多个,可以像字典那样取出对应的 array
arr = np.load("data/b.npz")
arr["a"]
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
arr["b"]
array([[ 0.,  1.,  2.],
       [ 3.,  4.,  5.],
       [ 6.,  7.,  8.],
       [ 9., 10., 11.]])
# 后缀都一样,你干脆当它和上面的没区别即可
arr = np.load("data/c.npz")
arr["b"]
array([[ 0.,  1.,  2.],
       [ 3.,  4.,  5.],
       [ 6.,  7.,  8.],
       [ 9., 10., 11.]])

Estadísticas y Propiedades

En esta sección, comenzamos con las propiedades estadísticas básicas de la matriz para obtener más información sobre la matriz que acabamos de crear. Incluye principalmente los siguientes aspectos:

  • Relacionado con el tamaño

  • Máximo, mínimo, medio, cuantil

  • Promedio, Suma, Desviación Estándar, etc.

Todos son indicadores relacionados con estadísticas descriptivas, que nos son de gran ayuda para entender un arreglo como un todo. Entre ellos, el más utilizado es el relacionado con el tamaño " shape", máximo, mínimo, promedio, sumatorio, etc.

El contenido de esta sección es muy sencillo, solo debes prestar especial atención (recuerda) a dos características importantes:

  • Encuentre el resultado por dimensión (especifique el eje). Generalmente, 0 significa columna 1 significa fila, lo que puede entenderse como " operar a lo largo de fila/columna ". Si no está seguro, puede intentarlo con un ejemplo.

  • Conservar dimensión después del cálculo ( keepdims=True)

Además, para la conveniencia de la operación, usamos una matriz generada aleatoriamente como objeto de operación; al mismo tiempo, especificamos la semilla, de modo que en cada ejecución, todos vean el mismo resultado. Generalmente, cuando entrenamos el modelo, a menudo necesitamos especificar la semilla, para que los parámetros se puedan ajustar bajo las "mismas condiciones".

#  先创建一个 Generator
rng = np.random.default_rng(seed=42)
#  再生成一个均匀分布
arr = rng.uniform(0, 1, (3, 4))
arr
array([[0.77395605, 0.43887844, 0.85859792, 0.69736803],
       [0.09417735, 0.97562235, 0.7611397 , 0.78606431],
       [0.12811363, 0.45038594, 0.37079802, 0.92676499]])

Relacionado con el tamaño

⭐⭐

Esta sección incluye principalmente: dimensión, forma y volumen de datos, de qué forma  shape usamos más.

⚠️ Cabe señalar que el tamaño no es una forma, y ​​ndim indica que hay varias dimensiones.

# 维度,array 是二维的(两个维度)
arr.ndim
2

np.shape

# 形状,返回一个 Tuple
arr.shape
(3, 4)
# 数据量
arr.size
12

Cuantil más valioso

⭐⭐⭐

Esta sección incluye principalmente: valor máximo, valor mínimo, mediana y otros cuantiles, de los cuales " valor máximo y valor mínimo " solemos ser los más utilizados.

⚠️ Cabe señalar que el cuantil puede ser cualquier decimal del 0 al 1 (que representa el cuantil correspondiente), y el cuantil no está necesariamente en la matriz original.

arr
array([[0.77395605, 0.43887844, 0.85859792, 0.69736803],
       [0.09417735, 0.97562235, 0.7611397 , 0.78606431],
       [0.12811363, 0.45038594, 0.37079802, 0.92676499]])
# 所有元素中最大的
arr.max()
0.9756223516367559

np.max/min

# 按维度(列)最大值
arr.max(axis=0)
array([0.77395605, 0.97562235, 0.85859792, 0.92676499])
# 同理,按行
arr.max(axis=1)
array([0.85859792, 0.97562235, 0.92676499])
# 是否保持原来的维度
# 这个需要特别注意下,很多深度学习模型中都需要保持原有的维度进行后续计算
# shape 是 (3,1),array 的 shape 是 (3,4),按行,同时保持了行的维度
arr.min(axis=1, keepdims=True)
array([[0.43887844],
       [0.09417735],
       [0.12811363]])
# 保持维度:(1,4),原始array是(3,4)
arr.min(axis=0, keepdims=True)
array([[0.09417735, 0.43887844, 0.37079802, 0.69736803]])
# 一维了
arr.min(axis=0, keepdims=False)
array([0.09417735, 0.43887844, 0.37079802, 0.69736803])

# 另一种用法,不过我们一般习惯使用上面的用法,其实两者一回事
np.amax(arr, axis=0)
array([0.77395605, 0.97562235, 0.85859792, 0.92676499])
# 同 amax
np.amin(arr, axis=1)
array([0.43887844, 0.09417735, 0.12811363])
# 中位数
# 其他用法和 max,min 是一样的
np.median(arr)
0.7292538655248584
# 分位数,按列取1/4数
np.quantile(arr, q=0.25, axis=0)
array([0.11114549, 0.44463219, 0.56596886, 0.74171617])
# 分位数,按行取 3/4,同时保持维度
np.quantile(arr, q=0.75, axis=1, keepdims=True)
array([[0.79511652],
       [0.83345382],
       [0.5694807 ]])
# 分位数,注意,分位数可以是 0-1 之间的任何数字(分位)
# 如果是 1/2 分位,那正好是中位数
np.quantile(arr, q=1/2, axis=1)
array([0.73566204, 0.773602  , 0.41059198])

desviación estándar media sumada

⭐⭐⭐

Esta subsección incluye principalmente: media, suma acumulada, varianza, desviación estándar y otros indicadores estadísticos adicionales. El más utilizado de estos es "promedio".

arr
array([[0.77395605, 0.43887844, 0.85859792, 0.69736803],
       [0.09417735, 0.97562235, 0.7611397 , 0.78606431],
       [0.12811363, 0.45038594, 0.37079802, 0.92676499]])

np.average

# 平均值
np.average(arr)
0.6051555606435642
# 按维度平均(列)
np.average(arr, axis=0)
array([0.33208234, 0.62162891, 0.66351188, 0.80339911])

# 另一个计算平均值的 API
# 它与 average 的主要区别是,np.average 可以指定权重,即可以用于计算加权平均
# 一般建议使用 average,忘掉 mean 吧!
np.mean(arr, axis=0)
array([0.33208234, 0.62162891, 0.66351188, 0.80339911])

np.sum

# 求和,不多说了,类似
np.sum(arr, axis=1)
array([2.76880044, 2.61700371, 1.87606258])
np.sum(arr, axis=1, keepdims=True)
array([[2.76880044],
       [2.61700371],
       [1.87606258]])

# 按列累计求和
np.cumsum(arr, axis=0)
array([[0.77395605, 0.43887844, 0.85859792, 0.69736803],
       [0.8681334 , 1.41450079, 1.61973762, 1.48343233],
       [0.99624703, 1.86488673, 1.99053565, 2.41019732]])
# 按行累计求和
np.cumsum(arr, axis=1)
array([[0.77395605, 1.21283449, 2.07143241, 2.76880044],
       [0.09417735, 1.0697997 , 1.8309394 , 2.61700371],
       [0.12811363, 0.57849957, 0.94929759, 1.87606258]])
# 标准差,用法类似
np.std(arr)
0.28783096517727075
# 按列求标准差
np.std(arr, axis=0)
array([0.3127589 , 0.25035525, 0.21076935, 0.09444968])
# 方差
np.var(arr, axis=1)
array([0.02464271, 0.1114405 , 0.0839356 ])

 

Supongo que te gusta

Origin blog.csdn.net/BYGFJ/article/details/123677005
Recomendado
Clasificación