Aprendizaje profundo: Explorando Tensor y Numpy

Tabla de contenido

introducción

1 tensor en pytorch

1.1 ¿Qué es el tensor?

1.2 ¿Por qué necesitas Tensor?

1.3 Cómo crear Tensor

1.3.1 Convertir y crear Tensor a partir de otras estructuras de datos existentes

1.3.2 Inicializar aleatoriamente un tensor

1.3.3 Cargar un tensor desde un archivo guardado

1.4 Características de los tensores

1.4.1 Operaciones de funciones comunes enriquecidas

1.4.2 Tipo de d flexible y conmutación sin CPU/GPU

1.4.3 Resolución automática de gradientes

2 entumecido

2.1 ¿Qué es Numpy?

2.2 Cuáles son las ventajas de NumPy

2.2.1 ndarray admite operaciones en paralelo (operaciones vectorizadas)

2.2.2 La eficiencia es mucho mayor que el código Python puro

2.2.3 Dirección de datos de almacenamiento continua

2.3 Cómo crear objetos Numpy

2.3.1 Crear una matriz ndarray usando Numpy

2.3.2 Comprobar la dimensión de la matriz y cambiar la dimensión

2.3.3 Los arreglos también se pueden manipular a través de los atributos de ndarray

 2.3.4 Crear una matriz cuyos elementos sean todos 0

2.3.4 Cree una nueva matriz con un tamaño de forma y un tipo de datos especificados rellenos con 1

2.3.5 Convertir una secuencia de Python en un objeto ndarray

 2.3.6 Crear una matriz utilizando un búfer especificado

 2.3.7 Convertir objeto iterativo en matriz ndarray

2.3.8 Crear una matriz con un rango de valores dado

 2.3.9 Crear una matriz dentro de un rango específico de valores

 2.3.10 Crear una matriz proporcional

2.4 Operaciones numéricas

2.4.1 Elementos de matriz de mosaico

2.4.2 Devolver una copia del arreglo como un arreglo unidimensional

2.4.2 Convertir a una matriz plana continua

2.4.3 Operaciones de bits en Numpy

2.4.4 Operaciones aritméticas

2.4.5 Operaciones con matrices numéricas

2.4.5 Multiplicación por elementos de dos matrices

 2.4.6 Producto matricial de dos matrices

2.4.7 Producto escalar de dos matrices

2.4.8 Producto interior de dos matrices

2.4.9 Resolución de ecuaciones matriciales lineales

2.4.10 Cálculo de la inversa de una matriz

3 Conversión mutua entre Tensor y Numpy

3.1 Tensor a Numpy

3.2 Numpy a Tensor

3.2.1 Usando antorcha.tensor

3.2.2 Uso de torch.from_numpy

4 Tensor a otro

4.1 Valor de conversión del tensor

4.2 Tensor a lista

4.3 Tensor a Lista Tensor


introducción

En el proceso de construcción de un modelo de aprendizaje profundo, Tensor y Numpy son indispensables y, a menudo, nos enfrentamos a la conversión mutua de las dos estructuras de datos.

  • ¿Cuál es exactamente la diferencia entre estas dos estructuras de datos?
  • ¿Cuándo elegir qué estructura de datos usar?
  • ¿Cómo convertir entre las dos estructuras de datos?

Este documento brinda respuestas a preguntas a través de múltiples dimensiones, como definiciones, escenarios de aplicación y métodos de conversión.

1 tensor en pytorch

1.1 ¿Qué es el tensor?

Tensor es la estructura de datos más básica y crítica en el aprendizaje profundo:

  • Tensor es para PyTorch lo que array es para Numpy o DataFrame para Pandas, y ambos construyen la estructura de datos de nivel más bajo en todo el marco;
  • Tensor es diferente de las estructuras de datos ordinarias y tiene una diferenciación automática de características extremadamente crítica.

 Definición: El significado original en inglés de Tensor es tensor, y se presenta de la siguiente manera en el sitio web oficial de Pytorch:

 Un tensor es una matriz de alta dimensión que contiene un solo tipo de datos. En términos generales, las características de alta dimensión de un tensor suelen describirse mediante una matriz tridimensional o superior, como se muestra en la siguiente figura: un solo elemento se denomina escalar (escalar), y una secuencia se llama vector, un plano compuesto de múltiples secuencias se llama matriz y un cubo compuesto de múltiples planos se llama tensor. Por supuesto, al igual que una matriz tiene una matriz unidimensional, una matriz bidimensional o incluso una matriz multidimensional, un tensor no necesita estar estrictamente limitado a más de tres dimensiones para ser llamado tensor. de aprendizaje profundo, escalares, vectores y matrices se denominan colectivamente tensores.

Tensor no es una definición única de PyTorch, sino una estructura de datos ampliamente utilizada por muchos marcos de aprendizaje profundo, como TensorFlow.

1.2 ¿Por qué necesitas Tensor?

Tensor en PyTorch es una estructura de datos ampliamente utilizada en el aprendizaje profundo. Es esencialmente una matriz de alta dimensión. No es una exageración entenderlo como la promoción y actualización de la matriz en NumPy. Sin embargo, debido a algunas características especiales que admite, Tensor es más conveniente cuando se usa para admitir modelos de aprendizaje profundo y capacitación.

1.3 Cómo crear Tensor

En términos generales, hay tres formas de crear un tensor:

  • Convierta y cree Tensor a partir de otras estructuras de datos existentes
  • Inicializar aleatoriamente un tensor
  • Cargar un tensor desde un archivo guardado

1.3.1 Convertir y crear Tensor a partir de otras estructuras de datos existentes

Esta puede ser la forma más utilizada en aplicaciones prácticas. A menudo se usa para cargar conjuntos de datos, como leer datos de una lista o una matriz NumPy, y luego generar un nuevo Tensor. Para lograr este objetivo, existen dos métodos comúnmente utilizados:

  •     soplete.tensor
  •     antorcha.Tensor

La diferencia entre los dos es que el primero usa la función tensor (t en minúscula), mientras que el segundo usa la clase Tensor (T en mayúscula). Los dos están creando el tipo de datos predeterminado de Tensor, admitiendo el paso de parámetros y el manejo de detalles individuales.

  • La primera es que el tipo de datos por defecto del Tensor creado es diferente:
import torch

t1 = torch.tensor([1,2,3])
t2 = torch.Tensor([1,2,3])
print(t1, t2)
print(t1.dtype, t2.dtype)

La pantalla en ejecución es la siguiente:

tensor([1, 2, 3]) tensor([1., 2., 3.])
torch.int64 torch.float32
  • En segundo lugar, usar la clase Tensor para inicializar e ingresar un entero devolverá un tensor unidimensional de todos ceros de esta longitud, mientras que la función de tensor devolverá un tensor de dimensión cero con solo este elemento:
import torch

t1 = torch.tensor(3)
t2 = torch.Tensor(3)
print(t1, t2)

El resultado de ejecución muestra:

tensor(3) tensor([0., 0., 0.])

Hay un detalle que debe mencionarse primero: cuando se usa la clase Tensor para recibir una secuencia para crear un Tensor, el tipo de datos devuelto es de tipo flotante, porque Tensor es la forma equivalente de FloatTensor, es decir, hay ByteTensor, IntTensor , LongTensor y diferentes tipos de datos predeterminados como DoubleTensor.

Cree otras dos funciones de uso común de Tensor basadas en datos existentes:

  •     from_numpy
  •     como_tensor

La mayor diferencia entre los dos métodos y los métodos anteriores es que el Tensor que devuelven comparte la memoria con los datos originales, mientras que la función del tensor y la clase Tensor antes mencionadas crean un nuevo objeto después de copiar.

import torch
import numpy as np

n1 = np.array([1,2,3])
n2 = np.array([1,2,3])
n3 = np.array([1,2,3])
t1 = torch.tensor(n1)
t2 = torch.from_numpy(n2)
t3 = torch.as_tensor(n3)
print('t1:', t1)
print('t2:', t2)
print('t3:', t3)

n1[0] = 100
n2[0] = 100
n3[0] = 100

print('t1:', t1)
print('t2:', t2)
print('t2:', t3)

El resultado de ejecución muestra:

t1: tensor([1, 2, 3])
t2: tensor([1, 2, 3])
t3: tensor([1, 2, 3])
t1: tensor([1, 2, 3])
t2: tensor([100,   2,   3])
t2: tensor([100,   2,   3])

1.3.2 Inicializar aleatoriamente un tensor

La inicialización aleatoria es una forma de uso común.Al construir un modelo de red neuronal, el peso del módulo se inicializa automáticamente de forma aleatoria después de agregar un módulo. Estos métodos se dividen en dos formas:

  •  Cree un tipo específico de tensor, como torch.ones, torch.randn, etc.
  •  Cree un tipo específico de tensor consistente con su forma basado en un tensor existente, como torch.ones_like, torch.randn_like, etc.
import torch

func_name = [x for x in dir(torch) if x.endswith('like')]
print(func_name)

El resultado de ejecución muestra:

['empty_like', 'full_like', 'ones_like', 'rand_like', 'randint_like', 'randn_like', 'zeros_like']

Construya aleatoriamente una unidad lineal completamente conectada en PyTorch, que creará los coeficientes de peso y las compensaciones correspondientes de forma predeterminada (debido a que los parámetros de red generalmente deben participar en el entrenamiento posterior del modelo, el valor predeterminado require_grad=True):

import torch

linear = torch.nn.Linear(2,3)
print('weight:', linear.weight)
print('bias:', linear.bias)

El resultado de ejecución muestra:

weight: Parameter containing:
tensor([[-0.5380, -0.6481],
        [ 0.0144,  0.0627],
        [-0.6560,  0.0382]], requires_grad=True)
bias: Parameter containing:
tensor([-0.2800,  0.0235, -0.6940], requires_grad=True)

1.3.3 Cargar un tensor desde un archivo guardado

PyTorch no distingue deliberadamente la forma del objeto que se va a guardar y cargar. Puede ser una red entrenada o datos. Esto es pickle en Python, que se realiza mediante las dos funciones torch.save y torch.load. No existe un requisito de formato de sufijo para el archivo guardado. Los formatos de sufijo comúnmente utilizados son .pkl, .pth y .pt. Este método se usa a menudo para guardar modelos y conjuntos de datos a gran escala.

import torch

t1 = torch.tensor([1,2,3,4,5])
torch.save(t1, 'tensor.pkl')

ret_t = torch.load('tensor.pkl')
print('ret_t', ret_t)

 El resultado de la operación es el siguiente:

ret_t tensor([1, 2, 3, 4, 5])

1.4 Características de los tensores

La razón por la que PyTorch define a Tensor para admitir el aprendizaje profundo, en lugar de usar directamente una lista en Python o una matriz en NumPy, es que Tensor está dotado de algunas características únicas. Las principales características de Tensor son los siguientes tres aspectos:

  •     Ricas funciones de operación comunes
  •     Tipo de d flexible y almacenamiento de conmutación libre de CPU/GPU
  •     Resolución automática de gradientes

1.4.1 Operaciones de funciones comunes enriquecidas

Tensor es esencialmente una matriz de alta dimensión compuesta de elementos numéricos. El proceso de aprendizaje profundo es el proceso de varias operaciones de matriz. Como su estructura de datos básica, Tensor admite operaciones de funciones ricas.

  • Tensor en sí opera funciones, como tensor.max(), tensor.abs(), etc.,
  • Tensor realiza operaciones relacionadas en otros tensores, como tensor.add() se usa para agregar otro tensor, tensor.mm() se usa para realizar la multiplicación de matrices con otro tensor, y así sucesivamente. La suma y la multiplicación aquí tienen requisitos para los dos tamaños de tensor de la operación.

Además de admitir operaciones de funciones lo suficientemente ricas, las funciones API de tensor tienen otra característica de conveniencia importante: la mayoría de las funciones admiten dos versiones: versión subrayada y versión no subrayada, como tensor.abs() y tensor.abs_(), ambas devuelven el Tensor después de la operación, pero al mismo tiempo, la versión subrayada pertenece a la operación en el lugar, es decir, sus propios datos también cambiarán después de la llamada.

1.4.2 Tipo de d flexible y conmutación sin CPU/GPU

El concepto de dtype en Tensor es similar al uso en NumPy y Pandas, que se usa para especificar la estructura de datos de Tensor que se creará. Hay 10 estructuras de datos diferentes definidas en PyTorch, incluidos tipos enteros de diferentes longitudes y tipos de punto flotante de diferentes longitudes.Todos los elementos del Tesor completo deben tener el mismo tipo de datos y deben ser de tipo numérico (la matriz en NumPy también requiere elementos son homogéneos, pero admiten tipos de cadena):

Además de admitir diferentes tipos de datos numéricos, otra característica importante de Tensor es que admite diferentes unidades informáticas: CPU o GPU. La compatibilidad con la aceleración de GPU también es clave para la aplicación a gran escala del aprendizaje profundo. Para cambiar entre computación de CPU (datos almacenados en la memoria) o computación de GPU (datos almacenados en la memoria de video), Tensor admite una configuración flexible de dispositivos de almacenamiento, incluidos los siguientes dos métodos:

  •     Al crear un tensor, especifíquelo directamente a través del parámetro del dispositivo
  •     Cambie a través de la función tensor.to(), to() se puede usar para cambiar dispositivos de almacenamiento y tipos de datos

Además, además de las dos características principales de dtype y device, Tensor en realidad tiene una tercera característica, a saber, el diseño. Incluye principalmente strided y sparse_coo, y esta característica generalmente no requiere consideración adicional.

1.4.3 Resolución automática de gradientes

La resolución automática de gradientes de tensor es la piedra angular del aprendizaje profundo. El núcleo del modelo de aprendizaje profundo radica en la conexión de las neuronas, y la clave para la conexión entre las neuronas es el peso de la red, que son los parámetros de cada módulo. Es precisamente debido a los diferentes parámetros de red que la misma estructura de red puede lograr diferentes valores de aplicación del modelo. Entonces, ¿cómo aprender los parámetros de red óptimos? Esta es el arma de optimización en el aprendizaje profundo: el método de descenso de gradiente, y una premisa importante del método de descenso de gradiente es admitir la solución automática de gradiente.

Para admitir la resolución automática de gradientes, el proceso general de Tensor es el siguiente:

  • Tensor admite la solución de graduación, es decir, require_grad=True
  • De acuerdo con el proceso de Tensor que participa en el cálculo, el Tensor y las funciones de operación correspondientes se registran como una estructura de árbol (o se denomina gráfico acíclico dirigido: DAG), y la dirección del cálculo es desde el nodo hoja hasta el nodo raíz.
  • Calcule la diferencia (pérdida) correspondiente de acuerdo con el tensor del nodo raíz y el valor objetivo, y luego use la regla de derivación de la cadena para calcular el gradiente paso a paso a la inversa (es decir, la propagación hacia atrás del gradiente)

2 entumecido

2.1 ¿Qué es Numpy?

Numpy, abreviatura de Numerical Python, es una biblioteca que consta de objetos de matriz multidimensional (ndarray) y una colección de funciones (función) para manipular estas matrices. Con la biblioteca Numpy, puede realizar operaciones matemáticas y operaciones lógicas relacionadas en matrices. Numpy no es solo un paquete de extensión de Python, sino también el paquete básico de computación científica de Python. Numpy proporciona una gran cantidad de funciones matemáticas, que se utilizan principalmente para calcular y procesar matrices unidimensionales o multidimensionales, y admite operaciones comunes de matrices y matrices. La capa inferior de NumPy está escrita principalmente en lenguaje C, por lo que puede realizar cálculos numéricos a alta velocidad. Numpy también proporciona una variedad de estructuras de datos, que pueden ser muy adecuadas para el funcionamiento de arreglos y matrices.
Como proyecto de código abierto, Numpy es desarrollado y mantenido conjuntamente por muchos colaboradores. Con el vigoroso desarrollo de la ciencia de datos (Data Science, denominada DS, que incluye análisis y procesamiento de big data, almacenamiento de big data, captura de datos y otras ramas), como Numpy, las bibliotecas de análisis de datos como SciPy (biblioteca de computación científica de Python), Pandas (biblioteca de procesamiento de datos basada en NumPy) y otras bibliotecas de análisis de datos tienen mucho crecimiento y todas tienen un formato de sintaxis más simple. Numpy generalmente se usa junto con Matplotlib, etc.

2.2 Cuáles son las ventajas de NumPy

2.2.1 ndarray admite operaciones en paralelo (operaciones vectorizadas)

Numpy tiene una función de cómputo paralelo incorporada. Cuando el sistema tiene múltiples núcleos, al hacer algún tipo de cálculo, numpy automáticamente hará cómputo paralelo.

2.2.2 La eficiencia es mucho mayor que el código Python puro

La capa inferior de Numpy está escrita en lenguaje C y el GIL (Global Interpreter Lock) está desbloqueado internamente. Su velocidad de operación en matrices no está limitada por el intérprete de Python, por lo que su eficiencia es mucho mayor que la del código Python puro.

2.2.3 Dirección de datos de almacenamiento continua

Cuando ndarray almacena datos, las direcciones de datos y datos son continuas, lo que hace que sea más rápido operar elementos de matriz en lotes.

Los tipos de todos los elementos en ndarray son los mismos, mientras que los tipos de elementos en las listas de Python son arbitrarios, por lo que la memoria de ndarray puede ser continua al almacenar elementos, mientras que la lista nativa de python solo puede encontrar el siguiente elemento al direccionarlo. no tan bueno como la lista nativa de Python en términos de rendimiento general, en computación científica, el ndarray de Numpy puede guardar muchas declaraciones de bucle, y el uso del código es mucho más simple que la lista nativa de Python.
 

2.3 Cómo crear objetos Numpy

Numpy define un objeto de matriz n-dimensional, denominado objeto ndarray, que es una colección de matriz compuesta por una serie de elementos del mismo tipo. Cada elemento de la matriz ocupa un bloque de memoria del mismo tamaño, y cada elemento de la matriz se puede obtener indexando o cortando. Los objetos ndarray tienen un atributo dtype que describe el tipo de datos de los elementos. El objeto ndarray adopta el mecanismo de índice de la matriz, asigna cada elemento de la matriz a un bloque de memoria y organiza el bloque de memoria de acuerdo con un determinado diseño. Hay dos métodos de diseño comúnmente utilizados, es decir, por fila o por columna.

El objeto ndarray se puede crear a través de la función integrada array() de Numpy, y su formato de sintaxis es el siguiente:

numpy.array(object, dtype = None, copy = True, order = None,ndmin = 0)

2.3.1 Crear una matriz ndarray usando Numpy

import numpy as np

a = np.array([1,2,3])
b = np.array([[1,2,3], [4,5,6]])

print(f'a:{a}')
print(f'type(a):{type(a)}')

print('b:{b}')

El resultado de ejecución muestra:

a:[1 2 3]
type(a):<class 'numpy.ndarray'>
b:{b}

2.3.2 Comprobar la dimensión de la matriz y cambiar la dimensión

import numpy as np

a = np.array([[1,2], [3,4], [5,6]])

print(a.ndim)
print("old array:", a)

a = a.reshape(2,3)
print("new array:", a.ndim, a)

El resultado de ejecución muestra:

old array: [[1 2]
 [3 4]
 [5 6]]
new array: 2 [[1 2 3]
 [4 5 6]]

2.3.3 Los arreglos también se pueden manipular a través de los atributos de ndarray

Propiedades de ndarray

import numpy as np

a = np.array([[1,2], [3,4], [5,6]])
print('a.shape:', a.shape)
print('a:', a)
a.shape = (2, 3)
print('a[2,3]:', a)
print('a[3,2]:', a.reshape(3, 2))

print('a.ndim:', a.ndim)
print('a.itemsize:', a.itemsize)
print('a.flags:', a.flags)

 dd

a.shape: (3, 2)
a: [[1 2]
 [3 4]
 [5 6]]
a[2,3]: [[1 2 3]
 [4 5 6]]
a[3,2]: [[1 2]
 [3 4]
 [5 6]]
a.ndim: 2
a.itemsize: 4
a.flags:   C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False

tipo de ndarray

El código de identificación del tipo de datos en Numpy, cada tipo de datos en Numpy tiene un código de carácter identificado de forma única, de la siguiente manera:

  • i- entero
  • b- Booleano
  • u- entero sin signo
  • f- punto flotante
  • c- Números compuestos de punto flotante
  • m- de cronometrado
  • M- fecha y hora
  • O- objeto
  • S- cadena
  • U- cadena unicode
  • V- bloques de memoria anclados de otros tipos (vacío)

Por lo general, Numpy se usa junto con el paquete SciPy, y SciPy puede considerarse como una extensión de la biblioteca Numpy, que agrega muchas funciones de cálculo de ingeniería sobre la base de Numpy.

2.3.4 Creación de matrices sin inicializar

numpy.empty(shape, dtype = float, order = 'C')

numpy.empty() crea una matriz no inicializada y puede especificar la forma (shape) y el tipo de datos (dtype) de la matriz creada. 

参数:

    shape:指定数组的形状;
    dtype:数组元素的数据类型,默认值是值 float;
    order:指数组元素在计算机内存中的储存顺序,默认顺序是“C”(“C”代表以行顺序存储,“F”则表示以列顺序存储)。
import numpy as np
n1 = np.empty([2, 2])
print(n1)

El resultado de ejecución muestra:

[[0.0e+000 5.4e-323]
 [9.9e-324 9.9e-324]]

 2.3.4 Crear una matriz cuyos elementos sean todos 0

numpy.zeros(shape,dtype=float,order="C")

Esta función se usa para crear una matriz cuyos elementos son todos 0 y también puede especificar la forma de la matriz. 

参数:

    shape:指定数组的形状;
    dtype:数组元素的数据类型,默认值是值 float;
    order:指数组元素在计算机内存中的储存顺序,默认顺序是“C”(“C”代表以行顺序存储,“F”则表示以列顺序存储)。
import numpy as np
n1 = np.zeros([2, 2])
print(n1)

El resultado de ejecución muestra:

[[0. 0.]
 [0. 0.]]

2.3.4 Cree una nueva matriz con un tamaño de forma y un tipo de datos especificados rellenos con 1

numpy.ones(shape, dtype = None, order = 'C')

Devuelve una nueva matriz de la forma, el tamaño y el tipo de datos especificados, y cada elemento de la nueva matriz se rellena con 1. 

import numpy as np
n1 = np.ones([2, 2])
print(n1)

El resultado de la ejecución muestra

[[1. 1.]
 [1. 1.]]

2.3.5 Convertir una secuencia de Python en un objeto ndarray

numpy.asarray(sequence,dtype = None ,order = None )

asarray() convierte una secuencia de Python en un objeto ndarray. 

参数:

    sequence:接受一个 Python 序列,可以是列表或者元组;
    dtype:可选参数,数组的数据类型,默认值是值 float;
    order:指数组元素在计算机内存中的储存顺序,默认顺序是“C”(“C”代表以行顺序存储,“F”则表示以列顺序存储)。
import numpy as np


array = [1, 2, 3, 4, 5]
n1 = np.asarray(array)
print(n1)
print(type(n1))

El resultado de la ejecución muestra

[1 2 3 4 5]
<class 'numpy.ndarray'>

 2.3.6 Crear una matriz utilizando un búfer especificado

numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)

Indica que se debe crear una matriz utilizando el búfer especificado. 

参数:

    buffer:将任意对象转换为流的形式读入缓冲区;
    dtype:返回数组的数据类型,默认是 float32;
    count:要读取的数据数量,默认为 -1 表示读取所有数据;
    offset:读取数据的起始位置,默认为 0。
import numpy as np

data =b'hello world!'
res = np.frombuffer(data,dtype='S3',offset=0)
print(res)

 El resultado de ejecución muestra:

[b'hel' b'lo ' b'wor' b'ld!']

 2.3.7 Convertir objeto iterativo en matriz ndarray

numpy.fromiter(iterable, dtype, count = -1)

Convierta el objeto de iteración en una matriz ndarray y su valor de retorno es una matriz unidimensional. 

参数:

    iterable:可迭代对象;
    dtype:数组元素的数据类型,默认值是值 float;
    count:读取的数据数量,默认为 -1,读取所有数据。
import numpy as np

iterable = (x * x*x for x in range(4))
n1 = np.fromiter(iterable, int)

print (n1)

 El resultado de la ejecución muestra

[ 0  1  8 27]

2.3.8 Crear una matriz con un rango de valores dado

numpy.arange(start, stop, step, dtype)
参数:

    start: 起始值,默认是 0。
    stop: 终止值,注意生成的数组元素值不包含终止值。
    step: 步长,默认为 1。
    dtype: 可选参数,指定 ndarray 数组的数据类型。
import numpy as np

A = np.arange(5)
print(A)
print(type(A))

A = np.arange(1, 5)
print(A)

A = np.arange(1, 5, 2)
print(A)

A = np.arange(1, 5.2, 0.6)
print(A)

El resultado de la ejecución muestra

[0 1 2 3 4]
<class 'numpy.ndarray'>
[1 2 3 4]
[1 3]
[1.  1.6 2.2 2.8 3.4 4.  4.6 5.2]

 2.3.9 Crear una matriz dentro de un rango específico de valores

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
参数:

    start:代表数值区间的起始值;
    stop:代表数值区间的终止值;
    num:表示数值区间内要生成多少个均匀的样本。默认值为 50;
    endpoint:默认为 True,表示数列包含 stop 终止值,反之不包含;
    retstep:默认为 True,表示生成的数组中会显示公差项,反之不显示;
    dtype:代表数组元素值的数据类型。
import numpy as np

n1 = np.linspace(start = 0, stop = 1, num = 11)
n2 = np.linspace(start = 0, stop = 100, num = 11)
n3 = np.linspace(start = 1, stop = 5, num = 4, endpoint = False)
n4 = np.linspace(start = 0, stop = 100, num = 5, dtype = int)
print(n1)
print(n2)
print(n3)
print(n4)

 El resultado de ejecución muestra:

[0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]
[  0.  10.  20.  30.  40.  50.  60.  70.  80.  90. 100.]
[1. 2. 3. 4.]
[  0  25  50  75 100]

 2.3.10 Crear una matriz proporcional

numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
参数:

    start: 序列的起始值:base**start。
    stop: 序列的终止值:base**stop。
    num: 数值范围区间内样本数量,默认为 50。
    endpoint: 默认为 True 包含终止值,反之不包含。
    base: 对数函数的 log 底数,默认为10。
    dtype: 可选参数,指定 ndarray 数组的数据类型。

En logspace, el punto de inicio y el punto final son potencias de 10

import numpy as np

n1 = np.logspace(0,0,10)
n2 = np.logspace(0,9,10)
n3 = np.logspace(0,9,10,base=2)

print(n1)
print(n2)
print(n3)

 El resultado de ejecución muestra:

[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1.e+00 1.e+01 1.e+02 1.e+03 1.e+04 1.e+05 1.e+06 1.e+07 1.e+08 1.e+09]
[  1.   2.   4.   8.  16.  32.  64. 128. 256. 512.]

2.4 Operaciones numéricas

2.4.1 Elementos de matriz de mosaico

numpy.ndarray.flat()

Devuelve un iterador de matriz, cada elemento del cual se puede recorrer con un bucle for.

import numpy as np

a = np.arange(8).reshape(2, 4)
print ('a:', a)

for e in a.flat:
    print (e, end=" ")

El resultado de ejecución muestra:

a: [[0 1 2 3]
 [4 5 6 7]]
0 1 2 3 4 5 6 7 

2.4.2 Devolver una copia del arreglo como un arreglo unidimensional

numpy.ndarray.flatten()

Devuelve una copia de la matriz como una matriz unidimensional. Las modificaciones a la copia no afectarán la matriz original.

import numpy as np

a = np.arange(8).reshape(2, 4)
print(a)
print(a.flatten())

El resultado de ejecución muestra:

[[0 1 2 3]
 [4 5 6 7]]
[0 1 2 3 4 5 6 7]

2.4.2 Convertir a una matriz plana continua

numpy.ravel()

Devuelve una matriz aplanada contigua (es decir, una matriz unidimensional expandida). A diferencia de flatten, devuelve una vista de matriz (la modificación de la vista afectará a la matriz original).

import numpy as np

a1, a2 = np.mgrid[1:4:1, 2:3:1]
print("a1:\n", a1, "\n", "a2:\n", a2)

n1 = a1.ravel() 
n2 = a2.ravel()

print("n1:", n1)
print("n2:", n2)
sum = n1 + n2
print(sum)

El resultado de ejecución muestra:

a1:
 [[1]
 [2]
 [3]] 
 a2:
 [[2]
 [2]
 [2]]
n1: [1 2 3]
n2: [2 2 2]
[3 4 5]

2.4.3 Operaciones de bits en Numpy

import numpy as np

n1 = np.bitwise_and([11,7], [4,25])
n2 = np.bitwise_and(np.array([2,5,255]), np.array([3,14,16]))
n3 = np.bitwise_and([True, True], [False, True])


n4 = np.bitwise_or([11,7], [4,25])
n5 = np.bitwise_or(np.array([2,5,255]), np.array([3,14,16]))
n6 = np.bitwise_or([True, True], [False, True])

print(n1)
print(n2)
print(n3)
print(n4)
print(n5)
print(n6)

El resultado de ejecución muestra:

[0 1]
[ 2  4 16]
[False  True]
[15 31]
[  3  15 255]
[ True  True]

2.4.4 Operaciones aritméticas

Las operaciones aritméticas de "suma, resta, multiplicación y división" de los arreglos NumPy corresponden a las funciones suma(), resta(), múltiple() y división() respectivamente.

  • La función numpy.reciprocal() toma el recíproco de cada elemento de la matriz y los devuelve como una matriz.
  • numpy.power() toma los elementos de la matriz a como base, exponencia los elementos de la matriz b correspondientes a a y finalmente devuelve los resultados del cálculo de los dos en forma de matriz.
  • numpy.mod() devuelve el resto después de dividir los elementos en las posiciones correspondientes de las dos matrices
import numpy as np

a = np.random.randint(9, size=(3, 3))
print("a =", a)
b = np.random.randint(9, size=(3, 3))
print("b =", b)
print("a + b =", np.add(a, b))
print("a - b =", np.subtract(a, b))
print("a x b =", np.multiply(a, b))
print("a / b =", np.divide(a, b))

El resultado de ejecución muestra:

a = [[8 0 2]
 [7 8 4]
 [3 5 1]]
b = [[2 3 5]
 [1 8 3]
 [4 1 2]]
a + b = [[10  3  7]
 [ 8 16  7]
 [ 7  6  3]]
a - b = [[ 6 -3 -3]
 [ 6  0  1]
 [-1  4 -1]]
a x b = [[16  0 10]
 [ 7 64 12]
 [12  5  2]]
a / b = [[4.         0.         0.4       ]
 [7.         1.         1.33333333]
 [0.75       5.         0.5       ]]

2.4.5 Operaciones con matrices numéricas

NumPy proporciona un módulo de biblioteca de matriz numpy.matlib, las funciones en este módulo devuelven un objeto de matriz en lugar de un objeto ndarray. La matriz se compone de m filas y n columnas (m*n) elementos, y los elementos de la matriz pueden ser números, símbolos o fórmulas matemáticas.

  • numpy.matlib.empty() devuelve una matriz vacía, que es muy rápida de crear.
  • numpy.matlib.zeros() crea una matriz llena de ceros.
  • numpy.matlib.ones() crea una matriz llena de unos.
  • numpy.matlib.eye() devuelve una matriz con 1 en la diagonal y 0 en los demás elementos.
  • numpy.matlib.identity() Esta función devuelve una matriz identidad de un tamaño dado, donde los elementos diagonales de la matriz son 1 y los otros elementos son 0.
  • numpy.matlib.rand() crea una matriz de dimensiones dadas llenas de números aleatorios.
import numpy as np
import numpy.matlib

print(np.matlib.empty((3, 4)))
print(np.matlib.zeros((3, 4)))
print(np.matlib.ones((3, 4)))

El resultado de ejecución muestra:

[[0.00000000e+000             nan 1.69759663e-313 0.00000000e+000]
 [0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000]
 [0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000]]
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]

2.4.5 Multiplicación por elementos de dos matrices

múltiple()

Función para la multiplicación por elementos de dos matrices.

import numpy as np

a1=np.array([[1,2], [3,4]], ndmin=2)
a2=np.array([[1,2], [3,4]], ndmin=2)

print(np.multiply(a1, a2))
[[ 1  4]
 [ 9 16]]

 2.4.6 Producto matricial de dos matrices

matmul()
se utiliza para calcular el producto matricial de dos matrices.

import numpy as np

a1=np.array([[1,2], [3,4]], ndmin=2)
a2=np.array([[1,2], [3,4]], ndmin=2)

print(np.matmul(a1, a2))

 El resultado de ejecución muestra:

[[ 7 10]
 [15 22]]

2.4.7 Producto escalar de dos matrices

La función dot()
se usa para calcular el producto escalar de dos matrices.

import numpy as np

a1=np.array([[1,2], [3,4]], ndmin=2)
a2=np.array([[1,2], [3,4]], ndmin=2)

print(np.dot(a1, a2))
[[ 7 10]
 [15 22]]

2.4.8 Producto interior de dos matrices

numpy.inner()
se usa para calcular el producto interno entre matrices.

import numpy as np
n1=np.inner(np.array([1,2,3,4]),np.array([1,2,3,4]))
a1=np.array(([[1,2],[3,4]]))
a2=np.array(([[11,12],[13,14]]))
n2=np.inner(a1,a2)

print(n1)
print(n2)

El resultado de ejecución muestra:

30
[[35 41]
 [81 95]]

2.4.9 Resolución de ecuaciones matriciales lineales

numpy.linalg.solve()
Esta función se utiliza para resolver ecuaciones matriciales lineales y representa la solución de ecuaciones lineales en forma de matriz.

Resuelva el sistema de ecuaciones x0 + 2 * x1 = 1y 3 * x0 + 5 * x1 = 2:

import numpy as np

a = np.array([[1, 2], [3, 5]])
b = np.array([1, 2])
x = np.linalg.solve(a, b)
print(x)

El resultado de ejecución muestra:

[-1.  1.]

2.4.10 Cálculo de la inversa de una matriz

numpy.linalg.inv()
Esta función se usa para calcular la matriz inversa de la matriz, y la matriz inversa se multiplica por la matriz original para obtener la matriz identidad. 

import numpy as np

a = np.array([[[1., 2.], [3., 4.]], [[1, 3], [3, 5]]])
n =np.linalg.inv(a)
print(a)
print(n)

El resultado de ejecución muestra:

[[[1. 2.]
  [3. 4.]]

 [[1. 3.]
  [3. 5.]]]
[[[-2.    1.  ]
  [ 1.5  -0.5 ]]

 [[-1.25  0.75]
  [ 0.75 -0.25]]]
[[[-2.    2.  ]
  [ 4.5  -2.  ]]

 [[-1.25  2.25]
  [ 2.25 -1.25]]]

3 Conversión mutua entre Tensor y Numpy

3.1 Tensor a Numpy

import numpy as np
import torch

t = torch.arange(1, 10).reshape(3, 3)
x = t.numpy()
print(f'a={t}')
print(f'b={x}')

El resultado de ejecución muestra:

a=tensor([[1, 2, 3],
          [4, 5, 6],
          [7, 8, 9]])
b=[[1 2 3]
   [4 5 6]
   [7 8 9]]

3.2 Numpy a Tensor

3.2.1 Usando antorcha.tensor

import numpy as np
import torch
a = np.random.normal(0, 1, (2, 3))
b = torch.tensor(a)
print(f'a={a}, b={b}')

   El resultado de ejecución muestra:

a=[[ 1.77128009  2.02509013  0.38144148]
   [ 1.14920329 -0.30733646 -1.20198951]]
b=tensor([[ 1.7713,  2.0251,  0.3814],
          [ 1.1492, -0.3073, -1.2020]], dtype=torch.float64)

3.2.2 Uso de torch.from_numpy

import numpy as np
import torch

a = np.random.normal(0, 1, (4, 5))
b = torch.from_numpy(a)
print(f'a={a}')
print(f'b={b}')

 El resultado de ejecución muestra:

a=[[ 1.27357033  0.43722359 -0.74243293 -0.19531152  0.95053336]
   [-0.52235811  0.95262418 -0.11157708  0.65592213  0.04188334]
   [ 0.14932165 -0.40966126  0.09067062  0.3212764  -2.41411188]
   [ 0.63391603  0.29742247 -0.43064322  1.08767221 -0.95699876]]
b=tensor([[ 1.2736,  0.4372, -0.7424, -0.1953,  0.9505],
          [-0.5224,  0.9526, -0.1116,  0.6559,  0.0419],
          [ 0.1493, -0.4097,  0.0907,  0.3213, -2.4141],
          [ 0.6339,  0.2974, -0.4306,  1.0877, -0.9570]], dtype=torch.float64)

4 Tensor a otro

4.1 Valor de conversión del tensor

import torch

a = torch.tensor([1])
b = a.item()

print(f'a={a}')
print(f'b={b}')

El resultado de ejecución muestra:

a=tensor([1])
b=1

4.2 Tensor a lista

import torch

t1 = torch.arange(10)
t2 = t1.tolist() 

print(f't1={t1}')
print(f't2={t2}')

El resultado de ejecución muestra:

t1=tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
t2=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

4.3 Tensor a Lista Tensor

import torch

t1 = torch.arange(10)
t3 = list(t1)

print(f't1={t1}')
print(f't3={t3}')

El resultado de la ejecución muestra

t1=tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
t3=[tensor(0), tensor(1), tensor(2), tensor(3), tensor(4), tensor(5), tensor(6), tensor(7), tensor(8), tensor(9)]

Supongo que te gusta

Origin blog.csdn.net/lsb2002/article/details/132103358
Recomendado
Clasificación