- numpy ( numerical python ) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
- numpy是 Python 的 第三方库。
【 1. 数组的创建 】
1. 创建一维数组
import numpy as np
'''法1'''
n1 = np.arange(5) #将数值0 1 2 3 4赋值给n1这个一维数组
'''法2'''
n2 = [y for y in range(5)] #创建一个1*5的一维数组
2. 创建多维数组
import numpy as np
'''法1:直接创建多维数组'''
b = np.array([np.arange(6),np.arange(6)])
#使用两个arange方法,创建了两个1x6的一维数组,然后使用numpy的array方法,将两个一维数组组合成一个2x6的二维数组。
'''法2:先创建一维数组,再创建多维数组(提高复用性)'''
yiwei=np.arange(6)
duowei=np.array([yiwei]*2)
#创建2x6的二维数组
【 2. 向量的基本运算 】
Numpy库可以直接进行一些四则运算,快速的处理两个Numpy数组:
1. 向量与向量的运算
① 向量+向量
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[4,5,6],[1,2,3]])
print(a+b)
print("")
print(np.add(a,b))
运行结果:
① 向量-向量
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[4,5,6],[1,2,3]])
print(a-b)
print('')
print( np.subtract(a,b) )
运行结果:
③ 向量x向量(x乘)
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[4,5,6],[1,2,3]])
print(a*b)
print('')
print( np.multiply(a,b) )
运行结果:
④ 向量·向量(点乘)
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = np.array([4,5,6])
print( np.dot(a,b) )
运行结果:
⑤ 向量÷向量
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[4,5,6],[1,2,3]])
print(a/b)
print('')
print( np.divide(a,b) )
运行结果:
2. 向量与标量的运算
① 向量+标量
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print( a+1 )
运行结果:
② 向量-标量
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print( a-1 )
运行结果:
③ 向量x标量
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print( a*2 )
运行结果:
④ 向量÷标量
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print( a/2 )
运行结果:
⑤ 向量%标量
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print( a%2 )
运行结果:
⑥ 矩阵转置
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print( a.T )
运行结果:
⑦ 矩阵的逆
矩阵可逆的充要条件是矩阵满秩。
import numpy as np
import numpy.linalg as lg
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(lg.inv(a) )
运行结果:
【 3. 数组的切片、索引 】
1. 切片
一维Numpy数组的切片操作与Python序列的切片一样。
import numpy as np
a = np.arange(9) #创建一维数组,元素值依次为0,1,2,3,4,5,6,7,8
print( a[3:7] ) #切片下标为3~7的元素(不包括下标为7的元素)
print()
print( a[:7:2] ) #切片下标范围从0到7(不包括下标为7的元素),且下标每次递增2
print()
print( a[::-1] ) #用负值下标来反转数组
运行结果:
2. 索引
import numpy as np
a=np.array([[1,2,3],[4,3,2]])
b = np.arange(5) #将数值0 1 2 3 4赋值给b这个一维数组
print(b[3])
print( a[1][0] )
print( a[1,:2] ) #逗号,前表示索引行;逗号,后表示切片该行
运行结果:
【 4. 数组的堆叠 】
1. 改变数组维度
① 改变维度 reshape()
import numpy as np
b = np.arange(24).reshape(2,3,4) #将一维数组按格式2,3,4切分
print(b)
运行结果:
② 改变维度 shape()
使用元组改变数组维度。
import numpy as np
a = np.arange(24)
a.shape = (6,4)
print(a)
运行结果:
③ 返回一维数组视图 ravel()
将多维数组展示为一维数组,ravel()返回的是一个数组的视图。
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b=a.ravel()
print("原数组a:\n",a)
print("原数组a改为一维数组b:\n",b)
b[0]=999
print("修改b后的b:\n",b)
print("修改b后的a:\n",a)
#因为b是a的一种展示方式,虽然他们是不同的对象,但在修改c的时候,a中相应的数也改变了
运行结果:
④ 返回一维数组 flatten()
功能与ravel()相同,但是flatten()返回的是真实的数组,需要分配新的内存空间。
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b=a.flatten()
print("原数组a:\n",a)
print("原数组a改为一维数组b:\n",b)
b[0]=999
print("修改b后的b:\n",b)
print("修改b后的a:\n",a)
#可见a并未改变,是由于b申请了新的内存,a和b互不影响。
运行结果:
⑤ 转置 transpose()
转置:调换数组的行列值的索引值。
import numpy as np
a = np.arange(4).reshape((2,2)) #生成一个2x2的数组
print("转置前:\n",a)
print("转置后:\n",a.transpose() )
运行结果:
2. 数组的堆叠
① 水平叠加 hstack((a,b))
import numpy as np
a = np.arange(9).reshape(3,3)
b = a *2
print("数组a:\n",a)
print("数组b:\n",b)
print("数组a、b水平叠加后:\n",np.hstack((a,b)) ) #注意hstack有两层括号
运行结果:
② 垂直叠加 vstack((a,b))
import numpy as np
a = np.arange(9).reshape(3,3)
b = a *2
print("数组a:\n",a)
print("数组b:\n",b)
print("数组a、b垂直叠加后:\n",np.vstack((a,b)) ) 注意vstack有两层括号
运行结果:
③ 深度叠加 dstack((a,b))
import numpy as np
a = np.arange(9).reshape(3,3)
b = a *2
print("数组a:\n",a)
print("数组b:\n",b)
print("数组a、b垂直叠加后:\n",np.dstack((a,b)) ) 注意dstack有两层括号
运行结果:
【 5. 数组的拆分 】
1. 横向拆分 hsplit(m,n)
m为要拆分的数组,n为要拆分成的维度
import numpy as np
a= np.arange(9).reshape(3,3)
print("数组a:\n",a)
print("数组a横向拆分后:\n",np.hsplit(a,3) )
运行结果:
2. 纵向拆分 vsplit(m,n)
m为要拆分的数组,n为要拆分成的维度
import numpy as np
a= np.arange(9).reshape(3,3)
print("数组a:\n",a)
print("数组a纵向拆分后:\n",np.vsplit(a,3) )
运行结果:
3. 深度拆分 dsplit(m,n)
m为要拆分的数组,n为要拆分成的维度
import numpy as np
a= np.arange(27).reshape(3,3,3)
print("数组a:\n",a)
print("数组a深度拆分后:\n",np.dsplit(a,3) )
运行结果:
数组a:
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]]
[[ 9 10 11]
[12 13 14]
[15 16 17]]
[[18 19 20]
[21 22 23]
[24 25 26]]]
数组a深度拆分后:
[array([[[ 0],
[ 3],
[ 6]],
[[ 9],
[12],
[15]],
[[18],
[21],
[24]]]), array([[[ 1],
[ 4],
[ 7]],
[[10],
[13],
[16]],
[[19],
[22],
[25]]]), array([[[ 2],
[ 5],
[ 8]],
[[11],
[14],
[17]],
[[20],
[23],
[26]]])]
Process finished with exit code 0