Python usa Numpy para procesar matrices

1. Introducción

Numpy es una biblioteca de ciencia y tecnología de Python de uso común, a través de la cual puede operar rápidamente en matrices, incluidas operaciones de forma, clasificación, selección, entrada y salida, transformada discreta de Fourier, álgebra lineal básica, operaciones estadísticas básicas y simulación aleatoria. Muchas bibliotecas de Python y paquetes de software de computación científica usan matrices de Numpy como objetos de operación, o convierten las matrices de Python entrantes en matrices de Numpy, por lo que la manipulación de datos en Python es inseparable de Numpy.

El núcleo de Numpy es el objeto ndarray, que está encapsulado por la matriz n-dimensional de Python, pero está precompilado por el lenguaje C para operaciones de matriz relacionadas, por lo que tiene una mayor eficiencia de ejecución que Python nativo, pero aún usa la codificación del lenguaje Python, por lo que también tiene Código simple y velocidad de ejecución eficiente. Hay algunas diferencias entre ndarry y arrays. Vale la pena señalar que los elementos en matrices numpy tienen el mismo tipo y tienen un tamaño fijo cuando se crean, que es diferente del crecimiento dinámico de los objetos de array Python.

2. Array objetos

2.1, atributos

Los objetos Numpy tienen la forma de matrices multidimensionales isomorfas. Las dimensiones de la matriz se denominan ejes, y el número de elementos en cada dimensión se denomina longitud del eje. Por ejemplo, la siguiente es una matriz bidimensional de 2 × 3 arr, la longitud del primer eje es 3, la longitud del segundo eje es 2

arr = [[ 1., 0., 0.],
       [ 0., 1., 2.]]

Los atributos comúnmente utilizados del objeto de matriz arr son los siguientes:

# 数组轴的个数
arr.ndim
# 数组维度及长度,例如2×3的数组其shape为(2, 3)
arr.shape
# 数组元素的总个数
arr.size
# 数组中元素的数据类型
arr.dtype
# 数组中元素所占字节数
arr.itemsize

2.2, crear una matriz

Puede usar el método array () para ajustar una matriz Python ordinaria para convertirla en una matriz numpy y especificar el tipo de datos del elemento mediante dtype =. La matriz puede ser una matriz bidimensional de igual dimensión o una tupla.

Si necesita llenar una matriz de tamaño conocido, puede usar la función ceros () para llenar todos los elementos con 0, o unos () para llenar elementos con 1, y vacío () para llenar elementos con números aleatorios

La función arange (a, b, c) se utiliza para generar un elemento de matriz de a a b cada longitud de c. La función linspace (a, b, c) se usa para generar elementos de matriz c entre a y b

# 普通数组转化为numpy数组
a1 = np.array([2, 3, 4], dtype=float)
print(a1)                                    
# 将元组数组转化为二维numpy数组
a2 = np.array([(1, 2, 3), (3, 4, 5)])
print(a2)
# 将3×3的数组用1填充
a3 = np.ones((3, 3))
print(a3)
# 从1到10,每隔2生成一个元素
a4 = np.arange(1, 10, 2)
print(a4)
# 在1到12之间生成4个元素
a5 = np.linspace(1, 12, 4, dtype=int)
print(a5)

'''
普通数组转化为numpy对象:
[2. 3. 4.]
元组数组:
[[1 2 3]
 [3 4 5]]
用1填充数组:
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
从1到10每隔2生成一个元素:
[1 3 5 7 9]
在1到12之间生成4个元素:
[ 1  4  8 12]
'''

2.3, operaciones de matriz

Los operadores aritméticos se pueden aplicar directamente a la matriz, y el resultado es aplicar la operación a cada elemento. Por ejemplo, la matriz A * B es la multiplicación correspondiente de cada elemento. La multiplicación de la matriz usa el símbolo @

A = np.array([[1, 1],
              [0, 1]])
B = np.array([[2, 0],
              [3, 4]])
print(A * B)
print(A @ B)

'''
矩阵元素对应相乘:
[[2 0]
 [0 4]]
矩阵的乘法:
[[5 4]
 [3 4]]
'''

Algunas funciones en numpy se aplican a toda la matriz, como la sumatoria, max, max, min. Si se especifica un eje en estos parámetros, se aplica al eje especificado.

También hay algunas funciones aplicadas a elementos específicos en la matriz, como encontrar sin, cos, exp, sqrt de raíz cuadrada, etc. Estas funciones se denominan funciones generales (ufunc)

a = np.array([[0, 1, 2, 3],
              [4, 5, 6, 7],
              [8, 9, 10, 11]])
print(a.max())  # 求整体的最大值,结果为11
print(a.sum(axis=0))  # 求每一列的和,结果为:[12 15 18 21]
print(np.sqrt(a))   # 数组每个元素求开方

La matriz en numpy se puede indexar, dividir e iterar como la lista en python. La matriz a [x] representa el acceso a los elementos de la matriz a con índice x, y la matriz unidimensional a [x: y] representa el acceso a los elementos de la matriz de x a y. Si se omite x, significa comenzar desde el principio, e y se omite hasta el final. a [x: y: a] representa un valor de xay cada elemento, si a es negativo, significa tomar el valor en orden inverso.

a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(a[1:3])  # 输出下标为1到3的元素:[1 2]
print(a[::-2])  # 逆序每隔两个元素选一个值:[9 7 5 3 1]

Si se trata de una matriz multidimensional, los índices están separados por comas. Puede usar ... para omitir ciertas dimensiones, si se omite, se considerará como toda la salida de la dimensión, por ejemplo, 如x[...,3]equivalente ax[:,:,:,:,3]。

可以通过for循环迭代多为数组,其内容为低一维度的子数组,如果希望遍历每一个子元素,可以使用flat属性。

a = np.array([[0, 1, 2, 3],
              [10, 11, 12, 13],
              [40, 41, 42, 43]])
# 输出a第一维(行)的前三个,第二维(列)下标的1~3
print(a[1:3, 0:3])
# 输出行的所有,下标为2的列
print(a[2, ...])
# 遍历数组
for row in a:
    print(row)
# 遍历每个子元素
for item in a.flat:
    print(item)

'''
后两行的1~3列:
[[10 11 12]
 [40 41 42]]
第三行的所有列:
[40 41 42 43]
遍历数组:
[0 1 2 3]
[10 11 12 13]
[40 41 42 43]
遍历每个元素:
0
1
2
......
41
42
43
'''

Además de usar números específicos como índices, también puede usar matrices numpy como índices. Por ejemplo, use la matriz i como índice de la matriz unidimensional a, y genere una [i]. Cuando la matriz i es una matriz multidimensional, seleccione los elementos de a y complete las posiciones correspondientes de la matriz i

a = np.arange(12) ** 2
print(a)
i = np.array([1, 3, 5])
print(a[i])
# 多维数组索引j
j = np.array([[3, 4], [9, 7]])
print(a[j])

'''
[  0   1   4   9  16  25  36  49  64  81 100 121]
数组a的1、3、5个元素
[ 1  9 25]
通过多为索引j取出a的数据填到对应位置
[[ 9 16]
 [81 49]]
'''

Si a es una matriz multidimensional, un solo elemento de la matriz indexada representa la primera dimensión de la matriz seleccionada a

Si la matriz multidimensional se indexa en varias dimensiones, se pasan varias matrices de índice i, j y se separan por comas

a = np.array(([[0, 1, 2, 3],
               [4, 5, 6, 7],
               [8, 9, 10, 11]]))
# 多维数组的单元素索引
i = np.array([0, 1])
print(a[i])
# 对多维数组提供多维度索引,同时提供i,j代表取出a的[0,2]、[1,3]两个元素
j = np.array([2, 3])
print(a[i, j])
'''
选择多维数组a的第0、1两行:
[[0 1 2 3]
 [4 5 6 7]]
a的[0,2]、[1,3]两个元素:
[2 7]
'''

2.4, cambiar la dimensión

El método reshape () de la matriz puede reconstruir la matriz original en una matriz de dimensiones objetivo, por ejemplo, reconstruir una matriz de 2 × 6 en una matriz de 3 × 4,

La matriz no modifica la matriz original durante la reconstrucción, pero devuelve la matriz de resultados modificada

Vale la pena señalar que la matriz se reconstruye e imprime desde la dimensión más a la derecha a la izquierda. Por ejemplo, la siguiente matriz 3 × 4 b, primero arregla 4 filas y luego ajusta, arregla tales 3 filas. Si es multidimensional, continúe produciendo de acuerdo con dichos rangos. Si la dimensión de la matriz es -1, el tamaño de la dimensión se calculará automáticamente, por ejemplo, una matriz con 12 elementos, la segunda y tercera dimensiones son 3 × 2, entonces la primera dimensión es 2

La función ravel () puede expandir la matriz en una matriz unidimensional.

a=np.array([[1,2,3,4,5,6],
            [7,8,9,10,11,12]])
b=a.reshape(3,4)
print(b)
# 多维数组,自动计算
print(a.reshape(-1,3,2))
# 展开数组
flatted = b.ravel()
print(flatted, end=' ')
'''
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
2×3×2的多维数组:
[[[ 1  2]
  [ 3  4]
  [ 5  6]]

 [[ 7  8]
  [ 9 10]
  [11 12]]]
展开数组:
[ 1  2  3  4  5  6  7  8  9 10 11 12] 
'''

La función hstack () de numpy puede fusionar múltiples matrices en la dirección horizontal, la función vstack () puede fusionar múltiples matrices en la dirección vertical

Por el contrario, hsplit () y vsplit () se pueden dividir en un número específico de matrices

a=np.array([1,2,3])
b=np.array([4,5,6])
# 垂直方向合并
c=np.vstack((a,b))
print(c)
# 水平方向合并
print(np.hstack((a,b)))
# 水平方向拆分
print(np.hsplit(c,3))
'''
垂直堆叠
[[1 2 3]
 [4 5 6]]
水平合并
[1 2 3 4 5 6]
水平拆分为三个1×2的:
[array([[1],
       [4]]), 
array([[2],
       [5]]), 
array([[3],
       [6]])]
'''

La función transpose () puede realizar la función de transposición de matriz . Por ejemplo, la siguiente matriz a es una matriz tridimensional 4 × 3 × 2. A través de la transposición (2,0,1), 0, 1 y 2 representan respectivamente las dimensiones originales de la matriz En la primera, segunda y tercera dimensiones, la posición entre paréntesis representa la dimensión transpuesta, por lo que la tercera dimensión de la matriz se coloca en la primera dimensión, la primera dimensión se coloca en la segunda dimensión y la segunda dimensión se coloca en la tercera dimensión, es decir Transponer en una matriz de 3 × 2 × 4.

a = np.array([
    [[1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 10, 11, 12]],
    [[13, 14, 15, 16],
     [17, 18, 19, 20],
     [21, 22, 23, 24]]
])
b = a.transpose(2, 0, 1)
print(b)

'''
----输出结果------
[[[ 1  5  9]
  [13 17 21]]
 [[ 2  6 10]
  [14 18 22]]
 [[ 3  7 11]
  [15 19 23]]
 [[ 4  8 12]
  [16 20 24]]]
'''

2.5, copia de la matriz

Cuando se asigna un objeto de matriz a una nueva variable, ¿abre un nuevo espacio de almacenamiento o simplemente pasa una referencia? La respuesta es cita.

Por ejemplo, ejecutar la instrucción b = a solo pasa una referencia a b, y la operación realizada en b afecta directamente a a. La identificación del nodo de los dos objetos a y b es la misma

a = np.array([1, 2, 3])
b = a
# 修改b
b[0] = 0
print(a)
# 输出a、b对象的id
print(id(a), id(b))

'''
修改b,a也发生了变化
[0 2 3]
查看二者的id
2290013812656 2290013812656
'''

Al volver a la vista de la matriz, modificar la forma de la vista no afectará a la matriz original, pero modificar los datos en la vista también cambiará la matriz original. Después de ejecutar del a, dado que c hace referencia a, a seguirá existiendo en la memoria y no se eliminará

c = a[:]
# 修改视图的形状
c.shape = 3, 1
print(c, a)
# 修改视图c的数据
c[0] = 1
print(a[0])

'''
对视图c的形状做修改,a不会受到影响
[[0]
 [2]
 [3]] [0 2 3]
修改c的数据,a也会随之改变:
1

El método copy () puede generar una copia de los datos, por lo que el funcionamiento de la copia no afectará en absoluto a la matriz original.

d= a.copy()
d[0]=5
# 修改数组的副本d,a不受影响,输出a:[1 2 3]
print(a)

3. Guarde el archivo

numpy guarda una matriz arr como un archivo .npy a través de save (), y puede leer el archivo a través de np.load ()

np.save("output.npy",arr)

arr = np.load("output.npy")

Si necesita almacenar múltiples matrices, puede guardarlo como un archivo .npz a través de np.savez (), y su nombre de variable se usa como el valor clave de la matriz, y puede usar load () para leer

np.savez('array_save.npz',arr1,arr2,arr3)

Arr=np.load('arr_save.npz')
arr1=Arr['arr1']        # 通过key值取到不同数组

Los archivos .npy y .npz no se pueden ver manualmente. Si necesita ver el formato, puede guardarlo como texto txt, guardarlo con savetxt () y leerlo con loadtxt ()

np.savetxt('data.txt',arr)

data=np.loadtxt('data.txt')

 Al guardar el archivo, puede establecer el formato de la matriz de salida a través del atributo fmt. Configure los datos que se guardarán como un entero de la siguiente manera, seguido de una pestaña

np.savetxt("./output.txt", data, fmt='%d	')

 

124 artículos originales publicados · Me gusta 65 · Visita 130,000+

Supongo que te gusta

Origin blog.csdn.net/theVicTory/article/details/103011188
Recomendado
Clasificación