Nota: El tamaño en el significado de la siguiente función se refiere al valor de la forma del atributo de la matriz
Resumen
-
- Introducción a Numpy
- Explicación de la función de biblioteca Numpy
-
- Tipos de datos numéricos
- Creación de Numpy
- numpy crear matriz aleatoria
- Funciones de propiedad de matrices Numpy
- Numpy cambia la forma de la matriz
- Numpy funciones estadísticas
- Operaciones matemáticas numéricas
- Operación de comparación numérica
- Numpy funciones exponenciales, logarítmicas, trigonométricas
- Numpy redondeo, redondeo
- Operaciones con matrices numéricas
- Fusión de matriz numpy
- División de matriz numpy
- Numpy otras funciones
- np.tensordot explicado
- fin
Introducción a Numpy
NumPy es un paquete de Python. Significa "Python Numérico". Es una biblioteca que consta de objetos de matriz multidimensional y una colección de rutinas para manipular matrices.
Numeric, el predecesor de NumPy, fue desarrollado por Jim Hugunin. También se ha desarrollado otro paquete, Numarray, que tiene algunas funciones adicionales. En 2005, Travis Oliphant creó el paquete NumPy al integrar la funcionalidad de Numarray en el paquete Numeric. Este proyecto de código abierto tiene muchos colaboradores.
Los estudiantes que aprenden Python deben conocer la biblioteca Numpy, y también saber que esta biblioteca es una biblioteca indispensable en el campo del aprendizaje automático. Aquí he recopilado algunas funciones de uso común de la biblioteca Numpy para usted, para que pueda encontrarla cuando necesite. úsalo
Explicación de la función de biblioteca Numpy
Tipos de datos numéricos
tipo | significado |
---|---|
np.int8 y np.uint8 | entero (-128 a 127) y entero sin signo (0 a 255) |
np.int16 y np.uint16 | Entero (-32768 a 32767) y entero sin signo (0 a 65535) |
np.int32 y np.uint32 | enteros (-2147483648 a 2147483647) y enteros sin signo (0 a 4294967295) |
np.int64 y np.uint64 | enteros (-9223372036854775808 a 9223372036854775807) y enteros sin signo (0 a 18446744073709551615) |
np.float16 | Número de punto flotante de precisión media (precisión de los últimos cuatro dígitos después del punto decimal) |
np.float32 | Número de punto flotante de precisión simple (precisión de los últimos 8 dígitos después del punto decimal) |
np.float64 | punto flotante de precisión doble |
np.complejo64 | Números complejos, representados por dos números de coma flotante de 32 bits (que consisten en números reales e imaginarios) |
np.complejo128 | Números complejos, representados por dos números de punto flotante de 64 bits (que consisten en números reales e imaginarios) |
np.bool_ | Valor booleano que consta de verdadero y falso |
Creación de Numpy
función | significado |
---|---|
np.array(objeto, dtype=Ninguno,copia=Verdadero) | objeto = [] o (), crea un grupo unidimensional. object = [[],[],…] o ((),()…), crea una matriz bidimensional. dtype puede elegir el tipo de datos, si no está escrito, el sistema juzgará automáticamente y completará el tipo de datos. copiar los valores predeterminados a Verdadero |
np.asarray(objeto,dtype=Ninguno) | Cuando np.array(copy=False) dos funciones iguales |
Explique el uso de la copia de parámetros en np.array, la descripción del texto es muy problemática, demostremos el código
import numpy as np
a = [-1,2,2]
a = np.array(a)
c = np.array(a,copy = False)
a[0] = 100
print('当copy=False')
print('c数组')
print(c)
print('a数组')
print(a)
#代码运行结果:
当copy=False
c数组
[100 2 2]
a数组
[100 2 2]
当copy=True
c数组
[-1 2 2]
a数组
[100 2 2]
A través de los resultados del código, podemos ver la diferencia entre copiar es Verdadero y Falso, y también entender la diferencia entre np.array y np.asarray
función | significado |
---|---|
Cree una secuencia aritmética np.arange([start,]stop, [step],[dtype]) | Cree una matriz desde el inicio hasta la parada-1 con un tamaño de paso de paso, donde el inicio predeterminado es 0, el paso predeterminado es 1 y la parada es un parámetro que debe completarse |
Cree una secuencia aritmética np.linspace (inicio, parada, [num], [punto final], [dtype]) | Cree una serie aritmética de principio a fin, num es el número de series aritméticas, el valor predeterminado es 50, el valor predeterminado de punto final es Verdadero, lo que indica que el último elemento de la serie contiene parada, de lo contrario, no |
array de valores especiales np.zeros(shape, [dtype],) | forma es un valor, cree una matriz unidimensional con un valor de 0 y forma sea una tupla o lista, cree una matriz con un valor de 0 igual al tamaño de la forma. |
array de valores especiales np.ones(shape,[dtype]) | la forma es un valor, crea una matriz unidimensional con un valor de 1 y la forma es una tupla o lista, crea una matriz con un valor de 1 con el tamaño de la forma |
matriz de valor especial np.eye(n,[m],[k],[dtype]) | n es el número de filas en la matriz. m es el número de columnas de salida, el valor predeterminado es n. El k predeterminado es 0, lo que significa que la diagonal principal es 1 y el resto son 0. Cuanto menor es el número negativo, la diagonal de 1 va debajo de la diagonal principal, y cuanto mayor es el número positivo, la diagonal de 1 va a la diagonal principal Ir por encima de la diagonal. |
numpy crear matriz aleatoria
función | significado |
---|---|
np.random.seed(k) | Si se usa el mismo valor de k, los números aleatorios generados cada vez son los mismos. Si este valor no está configurado, el sistema elegirá este valor de acuerdo con el tiempo. En este momento, los números aleatorios generados cada vez son diferentes debido a las diferencias horarias. |
np.random.random([tamaño]) | Genere aleatoriamente una matriz en el intervalo [0,1), szie solo genera una matriz de datos cuando no está completa, el tamaño puede recibir una lista o una tupla, y genera aleatoriamente una matriz del mismo tamaño que el tamaño |
np.aleatorio.al azar(x,x1,x2…) | Genere aleatoriamente una matriz que se ajuste al tamaño y la forma de (x, x1, x2...) en el intervalo [0,1) |
np.aleatorio.randn(x,x1,x2…) | Genere una matriz de (x,x1,x2...) tamaño y forma conforme a la distribución normal estándar |
np.random.randint(bajo, [alto], [tamaño], [tipod]) | Genere una matriz con el mismo tamaño en el intervalo [bajo, alto] y genere una matriz con el intervalo [0, bajo) cuando el parámetro alto no esté lleno. Cuando la forma no se completa, solo se genera una matriz de datos |
np.random.choice(a,[tamaño],[reemplazar=Verdadero],[p]) | Si a es un número, se extrae aleatoriamente un número de [0, a), y a es un número aleatoriamente extraído de una lista, una tupla y una matriz (debe ser unidimensional). Cuando no se completa el tamaño, solo se generará aleatoriamente un dato, el tamaño es un número y los datos de tamaño se generan aleatoriamente para formar una matriz unidimensional.Si el tamaño es una lista o una tupla, una matriz de los se generará el mismo tamaño que el tamaño. El valor predeterminado de replace es True, lo que significa que se puede tomar el mismo número, y False significa que no se puede tomar el mismo número. p corresponde a a, lo que significa la probabilidad de seleccionar cada elemento en la matriz a, y el valor predeterminado es que la probabilidad de seleccionar cada elemento es la misma. |
numpy.random.normal(loc=0.0, escala=1.0, tamaño=Ninguno) | loc: datos de coma flotante, la media (centro) de la distribución. escala: datos de punto flotante, la desviación estándar (ancho) de la distribución. size: un entero o una tupla de enteros, si se da size se genera un array del mismo tamaño que size. Si el tamaño es Ninguno (el valor predeterminado), se devuelve un valor. |
Funciones de propiedad de matrices Numpy
función | significado |
---|---|
soy yo | volver int. Indica las dimensiones de la matriz. |
forma | tupla de retorno. Representa el tamaño de la matriz. Para una matriz con n filas y m columnas, la forma es (n,m) |
tamaño | volver int. Representa el número total de elementos en la matriz, que es igual al producto de la forma de la matriz |
tipo de d | tipo de retorno. Describe el tipo de elementos en la matriz. |
tamaño del artículo | volver int. Representa el tamaño en bytes de cada elemento de la matriz |
nbytes | volver int. Indica el espacio ocupado por la matriz |
Numpy cambia la forma de la matriz
función | significado |
---|---|
np.reshape(a, nueva forma,) 或a.reshape(forma) | Las dos funciones tienen el mismo efecto. El parámetro newshape de np.reshape solo puede recibir listas y tuplas, pero a.reshape no solo puede recibir listas y tuplas, sino que cada elemento del parámetro se pasa como un parámetro separado. El número de elementos en la matriz transformada El número es el mismo que el número original de elementos, de lo contrario se informará un error |
np.resize(a,nueva_forma)或a.reszie() | new_shape solo puede recibir listas y tuplas, y a.resize puede recibir solo o lista y tuplas. El número de elementos de la matriz transformada puede ser diferente al de la matriz original, np.shape se puede llenar repetidamente y a.resize se puede llenar con 0. |
np.ravel(a) o a.ravel() | Convierta la matriz a en una matriz unidimensional |
a.flatten() | Convierta la matriz a en una matriz unidimensional |
np. apretar (a) | Quitar cotas con un elemento |
np.transpose(a,axes)或a.transpose() | a 为输入的数组。axes为元组 或 列表, 如果指定,它必须是包含[0,1,…,N-1]的排列的元组或列表,其中N是a的轴数,返回数组的第i个轴将与输入的编号为axes [i]的轴相对应。 axes默认为range(a.ndim)[::-1],这将反转轴的顺序。a.transpose功能与np.transpose一样,a.transpose可以接收多个数,元组或列表(这个难以理解,建议使用a.shape来查看使用该函数前后的变化) |
np.swapaxes(a, axis1, axis2)或a.swapaxes() | 交换axis1和axis2的所代表的两个轴,axis1和axis2都为整数。a.swapaxes也只能接收两个整数。切记这两个函数不能输入两个整数的列表或元组 |
Numpy统计函数
函数 | 含义 |
---|---|
np.sum(a, axis=None)或a.sum(axis = None) | 根据给定轴axis计算数组a相关元素之和,axis整数或元组 |
np.mean(a, axis=None)或a.mean(axis = None) | 根据给定轴axis计算数组a相关元素的期望,axis整数或元组 |
np.average(a,axis=None,weights=None) | 根据给定轴axis计算数组a相关元素的加权平均值 |
np.std(a, axis=None)或a.std(axis = None) | 根据给定轴axis计算数组a相关元素的标准差 |
np.var(a, axis=None)或a.var(axis = None) | 根据给定轴axis计算数组a相关元素的方差 |
np.min(a,axis=None)或a.min(axis=None) | 计算数组a中元素的最大值 |
np.max(a,axis=None)或a.max(axis=None) | 计算数组a中元素的最大值 |
np.argmin(a,axis=None)或 a.argmin(axis = None) | 计算数组a中元素最小值降为一维后的下标 |
np.argmax(a,axis=None)或 a.argmax(axis = None) | 计算数组a中元素最大值降为一维后的下标 |
np.ptp(a,axis=None)或a.ptp(axis = None) | 计算数组a中元素最大值与最小值的差 |
np.median(a,axis=None)或 a.median(axis = None) | 计算数组a中元素的中位数(中值) |
Numpy算数操作
函数 | 含义 |
---|---|
x1+x2或np.add(x1,x2) | x1与x2相加,x1与x2可以为数值也可以都为数组,数组的时候其shape的尺寸大小要相同 |
x1-x2或np.subtract(x1,x2) | x1减x2,x1与x2可以为数值也可以都为数组,数组的时候其shape的尺寸大小要相同 |
-x或np.negative(x) | 取x的负数,x可以为数值也可以为数组 |
x1*x2或 np.multiply(x1,x2) | x1x与2相乘,x1与x2可以为数值也可以都为数组,数组的时候其shape的尺寸大小要相同 |
x1/x2或np.divide(x1,x2) | x1除以x2,x1与x2可以为数值也可以都为数组,数组的时候其shape的尺寸大小要相同,x2为零的时候,值为inf(无限大) |
x1//x2或 np.floor_divide(x1,x2) | x1整除x2,x1与x2可以为数值也可以都为数组,数组的时候其shape的尺寸大小要相同 |
x1**x2或 np.power(x1,x2) | x1的x2次方,x1与x2可以为数值也可以都为数组,数组的时候其shape的尺寸大小要相同 |
x1%x1或 np.mod(x1,x2) | x1除以x2的余数,x1与x2可以为数值也可以都为数组,数组的时候其shape的尺寸大小要相同 |
Numpy比较操作
函数 | 含义 |
---|---|
x1==x2或np.equal(x1,x2) | 返回布尔数组 |
x1!=x2或no.not_equal(x1,x2) | 返回布尔数组 |
x1<x2或np.less(x1,x2) | 返回布尔数组 |
x1<=x2或np.less_equal(x1,x2) | 返回布尔数组 |
x1>x2或np.greater(x1,x2) | 返回布尔数组 |
x1>=x2或 np.greater_equal(x1,x2) | 返回布尔数组 |
Numpy的指数,对数,三角函数
三角函数输入和输出的是弧度制
函数 | 含义 |
---|---|
np.deg2rad | 将角度制化为弧度制 |
np.rad2deg | 将弧度制化为角度制 |
在使用三角函数的时候我们可以先将角度制化为弧度制,再带入三角函数。
函数 | 含义 |
---|---|
np.exp | 计算指数(e^x) |
np.log,np.log10,np.log2,np.log1p | 求以e为底,以10为低,以2为低,以(1+x)为底的对数 |
np.sign | 将数组中的值标签化,大于0的变成1,等于0的变成0,小于0的变成-1 |
np.cos,np.sin,np.tan | 三角函数 |
np.arccos,np.arcsin,np.arctan | 反三角函数 |
Numpy取整,四舍五入
函数 | 含义 |
---|---|
np.ceil | 朝着无穷大的方向取整,比如5.1会变成6,-6.3会变成-6 |
np.floor | 朝着负无穷大方向取证,比如5.1会变成5,-6.3会变成-7 |
np.rint(a) | 四舍五入取整 |
np.round(a,decimals=0) | 返回四舍五入后的值,decimals为小数点后的位数 |
np.modf | 将整数和小数分隔开来形成两个数组 |
array.astype(‘数据类型’) | 转换数组array的数据类型 |
Numpy矩阵运算
函数 | 含义 |
---|---|
np.dot(a,b) | a与b进行数组的行列式相乘 |
np.linalg.inv(a) | 求矩阵a的逆 |
np.linalg.det(a) | 求a的行列式 |
np.linalg.eig(a) | 求a的特征值和特征向量 |
np.linalg.sval(a) | 求a的奇异值分解 |
np.linalg.norm(a, ord=2, axis=None,) | ord=1:求一范数,ord=2:求二范数,ord=np.inf:无穷范数, |
Numpy数组合并
函数 | 含义 |
---|---|
np.append(arr, values, axis=None) | arr:需要被合并values的数组。values:合并到数组arr中的数组。axis:可选参数,如果axis没有给出,合并后返回值为一维数组。axis被填写,按照axis指定的维度合并(axis填写时arr和values需有相同的shape的尺寸大小) |
np.concatenate(arrays, axis=None) | array多个数组组成的列表或元组。axis填写后将按照axis指定的维度合并(array中的数组可以是不同的shape的尺寸大小) |
np.stack(arrays, axis=0) | array多个数组组成的列表或元组。axis填写后将按照axis指定的维度合并(array中的数组需为相同的shape的尺寸大小) |
np.hstack(tup) | 横向合并,tup多个数组组成的列表或元组。建议使用二维数组,多维数组当shape的尺寸大小不同时有时可以合并,有时不可以。 |
np.vstack(tup) | 竖向合并,tup多个数组组成的列表或元组。 |
Numpy数组分割
函数 | 含义 |
---|---|
np.split(ary, indices_or_sections, axis=0) | ary:要切分的数组。indices_or_sections:如果是一个整数,表示将arry切割为改整数份,如果是一个列表或元组(第一个值不要为0),列表值进行切分。axis:沿着哪个维度进行切向,默认为0,横向切分,1表示竖向切分。 |
np.hsplit(ary, indices_or_sections) | 竖向切分。ary:要切分的数组。indices_or_sections:如果是一个整数,表示将arry切割为改整数份,如果是一个列表或元组(第一个值不要为0),列表值进行切分。 |
np.vsplit(ary, indices_or_sections) | 横向切分。ary:要切分的数组。indices_or_sections:如果是一个整数,表示将arry切割为改整数份,如果是一个列表或元组(第一个值不要为0),列表值进行切分。 |
Numpy其他函数
函数 | 含义 |
---|---|
np.take(a,indices,axis = None)/a.take() | a:要提取的数组。indices;要提取的值的索引的列表。axis=0:抽取相应索引行的数据。axis=1:抽取相应索引列的数据。axis=None:将数组转化为一维数据再进行索引相对应的数据 |
np.argmax(array, axis=None) /array.argmax(axis=None) | array:代表输入数组;axis=0:对array取每一列的最大值的索引,axis=1:对array取每一行的最大值的索引。axis=None:j将array转为一维数据再进行取最大值的索引(axis为1和0所对应的列和行没有写错,它是和别人不同) |
np.tensordot讲解
np.tensordot函数是对于高维矩阵进行的内积运算,这个内积的过程不好理解,建议从维度上进行理解就好了
np.tensordot(a,b,axes)
a,b是要进行内积运算的矩阵
axes是矩阵要运算的维度
1.当axes = n时,n为整数时,代表的是a的后n个维度与b的前n个维度进行内积后,a去掉后n个维度,b去掉前n个维度两者再结和的维度,看例子:
首先定义两个矩阵
>>> a = np.random.rand(4,5,3,2)
>>> b = np.random.rand(2,3,5,4)
这里设定axes = 0时代表没有维度去掉,故新矩阵维度为(4, 5, 3, 2, 2, 3, 5, 4)
axes = 1的时候运算后的矩阵的大小为去掉了a的后一个维度与b 的前一个维度故新矩阵维度为(4, 5, 3, 3, 5, 4)
>>> print(np.tensordot(a,b,axes = 0).shape)
(4, 5, 3, 2, 2, 3, 5, 4)
>>> print(np.tensordot(a,b,axes = 1).shape)
(4, 5, 3, 3, 5, 4)
这里是axes = 2的时候,但是a的后2个维度与b的前2各维度不相同,就会报错
>>> print(np.tensordot(a,b,axes = 2).shape)
Traceback (most recent call last):
File "<pyshell#47>", line 1, in <module>
print(np.tensordot(a,b,axes = 2).shape)
File "<__array_function__ internals>", line 200, in tensordot
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\core\numeric.py", line 1117, in tensordot
raise ValueError("shape-mismatch for sum")
ValueError: shape-mismatch for sum
修改b的维度使得b的前2个维度与a的后2个维度相同,新矩阵的大小为(4, 5, 5, 4)
>>> b = np.random.rand(3,2,5,4)
>>> print(np.tensordot(a,b,axes = 2).shape)
(4, 5, 5, 4)
2.当axes = [m,n],代表a的m维度与b的n维度进行的内积,新的矩阵大小为去掉a的m维b的n维然后再组合
首先我们看一下a,b的各维度的大小
>>> print(a.shape,b.shape)
(4, 5, 3, 2) (3, 2, 5, 4)
接着尝试内积a的2维b的0维,去掉后可以看见新矩阵的大小为(4, 5, 2, 2, 5, 4)
>>> print(np.tensordot(a,b,axes = [2,0]).shape)
(4, 5, 2, 2, 5, 4)
但是如果想要内积的维度大小不同,会报错
>>> print(np.tensordot(a,b,axes = [1,1]).shape)
Traceback (most recent call last):
File "<pyshell#61>", line 1, in <module>
print(np.tensordot(a,b,axes = [1,1]).shape)
File "<__array_function__ internals>", line 200, in tensordot
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\core\numeric.py", line 1117, in tensordot
raise ValueError("shape-mismatch for sum")
ValueError: shape-mismatch for sum
3.如果axes接收的是一个嵌套列表的列表:[[m], [n]],等于说可以选多个维度内积 (注意这里的两个列表相对应的维度的大小要相同),然后去掉a,b相应的维度,再组合
首先查看a,b的各维度大小,接着我们这里想要在大小为5和2的维度上内积,这里一定要注意两个列表中维度大小要相同
>>> print(a.shape,b.shape)
(4, 5, 3, 2) (3, 2, 5, 4)
>>> print(np.tensordot(a,b,axes = [[1,3],[2,1]]).shape)
(4, 3, 3, 4)
结尾
Numpy函数太多了,这里就写了一些比较常用的函数,总结这些函数真是太费时间了,函数的用法我是自己上机实验过,按照自己的理解整理的,内容可能不全,讲解的不够详细。如果你有什么疑惑或不懂的地方,建议亲自实践。以后遇见了更多的函数我会继续补充的。希望大家多多支持。