导入模块
import numpy
凡是该模块的命令(比如array)都要加上numpy成为numpy.array
简写形式: 输入时敲入 import numpy as np numpy.array → np.array.
如果需要非常完整、系统地学习操作手册,大家可以参考 https://docs.scipy.org/doc/numpy/reference/
数组创建
import numpy as np
np.array([1, 2, 3, 4], dtype=‘float32’) #从Python列表创建
np.zeros(10,dtype=int) #创建一个长度为10,值都是0的数组
np.ones((3,5),dtype=float) #创建一个3*5的浮点型数组,值都是1
np.linspace(0,1,5) #创建一个5元素数组,这5个数均匀分配到0-1
np.random.random((3,3)) #创建一个3*3,在0-1均匀分布的随机数构成的数组
np.random.normal(0,1,(3,4)) # 创建一个3*4,均值为0、标准差为1的正态分布随机数数组
np.eye(3) # 创建一个3*3的单位矩阵
数据文件存取
import numpy as np
x = np.random.randn(25,5)
np.savetxt('tabs.txt',x) #存成制表符分隔的文件
np.savetxt('commas.csv',x,delimiter=',') #存成逗号分隔的文件(如csv)
u = np.loadtxt('commas.csv',delimiter=',') #读取逗号分隔文件
v = np.loadtxt('tabs.txt') #读取制表符分隔文件
矩阵和数组
import numpy as np
y = np.array([[[1,4,7],[2,5,8]],[[3,6,9],[10,100,1000]]])
print (y)
print(“y ndim:”,y.ndim,np.ndim(y)) #维度
print(“y shape:”, y.shape,np.shape(y)) #每个维度大小
print(“y size:”, y.size,np.size(y)) #数组的总大小
print(“y type:”, y.dtype,type(y)) #数组的数据类型;整个y的类型
y[0,1,2]
y[0,1,-1]
y[0,1,:]
print(y[0,1,2], y[0,1,-1], y[0,1,:])
y[0,1,2]=-99 #索引方式修改元素值
print(y)
y[0,1,2]=-99.233333#Numpy数组为固定类型,浮点值会被自动截短为整型
print(y)
数组运算
基本操作
import numpy as np
u = [0, 1, 2];v=[5,2,7]
u=np.array(u);v=np.array(v)
print (u.shape,v.shape)
print (u+v,u/v,np.dot(u,v))
u = [0.0, 1, 2];v=[5,2,7]
u=np.array(u);v=np.array(v); print (u+v,u/v);
print (v/3, v/3.,v/float(3),(v-2.5)**2)
x=np.arange(3,5,.5)
y=np.arange(4)
print (x,y,x+y,x*y) #向量计算
print (x[:,np.newaxis].dot(y[np.newaxis,:]))
print (np.shape(x),np.shape(y))
print (np.shape(x[:,np.newaxis]),np.shape(y[np.newaxis,:]))
print (np.dot(x.reshape(4,1),y.reshape(1,4)))
print (np.dot(x.T,y.T), x.T.dot(y.T))#x.T是x的转置
print (x.reshape(2,2).dot(np.reshape(y,(2,2))))
x=[[2,3],[7,5]]
z = np.asmatrix(x)
print (z, type(z));print (z.transpose() * z )
print (z.T*z== z.T.dot(z),z.transpose()*z==z.T*z)
print (np.ndim(z),z.shape)
练习π的近似
π=4(1−1/3+1/5−1/7+1/9−1/11+…)=4(1+1/5+1/9+1/13…)−4(1/3+1/7+1/11+…)
positive_term_denominators = np.arange(1, 1e6, 4)
positive_terms = 1 / positive_term_denominators
negative_terms = 1 / (positive_term_denominators + 2)
4 ∗ (sum(positive_terms) − sum(negative_terms))
π=2·(2/1·2/3·4/3·4/5·6/5·6/7···)=2·(2/1·4/3·6/5···10^6/999999)(2/3·4/5·6/7···10^6/10^6+1)
even = np.arange(2,1000001,2)
one_below_even = even – 1
one_above_even = even + 1
2 * np.prod(even/one_below_even)*np.prod(even/one_above_even)
数组运算
比较操作
x = np.array([[1, 2, 3, 4, 5],[6, 7, 8, 9, 10]])
print('x < 3:',x < 3) # np.less(x, 3)
print('x >= 3:',x >= 3)
print('x != 3:',x != 3)
Operator | Equivalent ufunc | Operator | Equivalent ufunc |
== | np.equal | != | np.not_equal |
< | np.less | <= | np.less_equal |
> | np.greater | >= | np.greater_equal |
统计记录个数
x = np.array([[1, 2, 3, 4, 5],[6, 7, 8, 9, 10]])
np.count_nonzero(x < 6) # how many values less than 6?
np.sum(x < 6) # same as np.count_nonzero()
np.sum(x < 6, axis=1) # how many values less than 6 in each row?
np.any(x > 8) # are there any values greater than 8?
np.all(x == 10) # are all values equal to 10?
np.sum((x > 5) & (x < 8))
np.std(x, axis=1)
x[x < 5] # 返回满足条件的值
np.where(x<5,-1,x) #将x中小于5的数值全部替换为-1
np.argmax(X) #以行优先,输出位置
排序
import numpy as np
x = np.array([2, 1, 4, 3, 5])
np.sort(x) # 不修改原始输入数组x
x.sort();print(x) # 替代原始数组x
i = np.argsort(x);print(i) # 原始数组排好序的索引值
x[i] # 按照索引来排好序的数组
rng = np.random.default_rng(seed=42)
X = rng.integers(0, 10, (4, 6));print(X)
np.sort(X, axis=0) #按列排序
按行或列合并矩阵
x = np.array([[1.0,2.0],[3.0,4.0]])
y = np.array([[5.0,6.0],[7.0,8.0]])
z = np.concatenate((x,y),axis = 0)
z1 = np.concatenate((x,y),axis = 1)
print (z,"\n" ,z1,"\n",z.transpose()*z1)
z = np.vstack((x,y)) # Same as z = concatenate((x,y),axis = 0)
z1 = np.hstack((x,y))
print (z,"\n",z1)
抽取数组(矩阵)的子数组
print (np.ogrid[0:3,0:2:.5],'\n',np.mgrid[0:3,0:2:.5])
print (np.ogrid[0:3:3j,0:2:5j],'\n',np.mgrid[0:3:3j,0:2:5j])
x = np.reshape(np.arange(25.0),(5,5))
print ('x=\n',x)
print ('np.ix_(np.arange(2,4),[0,1,2])=\n',np.ix_(np.arange(2,4),[0,1,2]))
分割数组
x = np.reshape(np.arange(24),(4,6))
y = np.array(np.vsplit(x,2))
z = np.array(np.hsplit(x,3))
print ('x={}\ny={}\nz={}'.format(x,y,z))
print (x.shape,y.shape,z.shape)
print (np.delete(x,1,axis=0)) #删除x第2行
print (np.delete(x,[2,3],axis=1)) #删除x第3,4列
print (x.flat[:], x.flat[:4]) #把x变成向量
矩阵的对角线元素与对角线矩阵
x = np.array([[10,2,7],[3,5,4],[45,76,100],[30,2,0]])
y=np.diag(x) #对角线元素
print ('x={}\ny={}'.format(x,y))
print ('np.diag(y)=\n',np.diag(y)) #由向量形成对角线方阵
print ('np.triu(x)=\n' ,np.triu(x)) #x上三角阵
print ('np.tril(x)=\n',np.tril(x)) #x下三角阵
随机数的产生
print(np.random.randn(2,3)) #随机标准正态2×3矩阵 #给定均值矩阵和标准差矩阵的随机正态矩阵:
print (np.random.normal([[1,0,3],[3,2,1]],[[1,1,2],[2,1,1]]))
print (np.random.normal((2,3),(3,1))) #均值为2,3标准差为3,1的2个随机正态数
print (np.random.uniform(2,3)) #均匀U[2,3]随机数
np.random.seed(1010) #随机种子
print (np.random.random(10)) #10个随机数(0-1之间)
print (np.random.randint(20,100)) #20到100之间的随机整数
print (np.random.randint(20,100,10)) #20到100之间的10个随机整数
print (np.random.choice(np.arange(-10,10,3))) #从序列随机选一个
x=np.arange(10);np.random.shuffle(x);print (x)
线性代数运算
x=np.random.randn(3,3)
print (np.linalg.det(x)) #行列式
y=np.random.randn(3)
print (np.linalg.solve(x,y)) #解联立方程
u,s,v= np.linalg.svd(x) #奇异值分解
print ('x inverse=', np.linalg.inv(x)) #矩阵的逆
task
固定随机数种子为2024,生成12个服从均值为0.5,方差为1正态分布的随机数,命名为x与12个服从[0,1]上均匀分布的随机数,命名为y。
把x构造成3行, 4列的矩阵; 把y构造成4行, 3列的矩阵。
把两个矩阵相乘;
把x和y的转置点乘。找出x最大值所在的位置。
删去x第3列; 对x求逆; 将x所有大于0.5的元素定义为0 取出x矩阵的对角线元素。
对x的行求和; 对x的列求标准差。
import numpy as np
np.random.seed(2024) # 固定随机数种子
x = np.random.normal(loc=0.5, scale=1, size=12) # 生成服从均值为0.5,方差为1的正态分布随机数
y = np.random.uniform(0, 1, 12) # 生成服从[0,1]上均匀分布的随机数
x_matrix = np.reshape(x, (3, 4)) y_matrix = np.reshape(y, (4, 3))
matrix_multiply = np.dot(x_matrix, y_matrix) # 矩阵相乘
transpose_dot_product = x_matrix.T* y_matrix # x和y的转置点乘
max_position = np.unravel_index(np.argmax(x_matrix), x_matrix.shape) # 找出x最大值所在的位置
x_deleted_col = np.delete(x_matrix, 2, axis=1) # 删除x第3列
x_inverse = np.linalg.inv(x_deleted_col) # 对x求逆
x_thresholded = np.where(x_deleted_col > 0.5, 0, x_deleted_col) # 将x所有大于0.5的元素定义为0
x_diagonal = np.diag(x_thresholded) # 取出x矩阵的对角线元素
row_sum_x = np.sum(x_thresholded, axis=1) # 对x的行求和
column_std_x = np.std(x_thresholded, axis=0) # 对x的列求标准差