import numpy as np
创建Ndarray对象,此对象为一个矩阵
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]], dtype=int)
输出矩阵a
print(a)
输出a的类型
print(“a对象的类型:”, type(a))
输出a的维数(秩)
print(“维数:”, a.ndim)
输出a的维度
print(“维度:”, a.shape) print(“元素总数:”, a.size) print(“元素类型:”, a.dtype) print(“元素大小:”, a.itemsize)
创建零矩阵
b = np.zeros((3, 3), int, ‘C’) print(b)
创建1矩阵
c = np.ones(shape=(3, 3), dtype=np.int, order=‘C’) print?
从已有数组(列表,元组,数组等类型)创建数组
d = np.asarray(a=a, dtype=np.float, order=‘F’) print(d)
向量切片
f = np.arange(10) s = slice(0, 7, 2) print(f[s])
向量索引
g = f[2:7:1] print(g)
矩阵切片
print(a[1:]) # 从第二行开始切片 print(a[:1]) # 在第二行结束切片
切片还可以包括省略号 …,来使选择元组的长度与数组的维度相同。
print(a[…, 1:]) # 第二列及其剩下元素 print(a[1:, …]) # 第一行及其以后元素
NumPy高级索引
x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]) y = x[[0, 1, 2], [0, 1, 0]] # 获取矩阵x中(0,0)(1,1)(2,0)处的值 print(y)
整数索引
h = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) b = h[1:3, 1:3] c = h[1:3, [1, 2]] d = h[…, 1:] print(b) print? print(d)
布尔索引
print(a[a > 5])
花式索引
print(a[[2, 1, 3]])
NumPy广播
i = np.array([1, 2, 3]) j = np.array([0, 1, 0]) c = i * j # 向量对应位置相乘 print? print(a + i) # a是34矩阵,i是13向量,二者相加,触发广播机制,等效于把数组 i 在二维上重复 4 次再运算:
NumPy迭代访问
迭代访问a中元素
for i in np.nditer(a): print(i, end=",") print("\n") for i in np.nditer(a.T): print(i, end=",") print("\n") # attention:a和a.T遍历出来一样,说明内存中存储顺序一样
C风格遍历(行序优先)
for i in np.nditer(a, order=‘C’): print(i, end=",") print("\n")
C风格遍历(列序优先)
for i in np.nditer(a, order=‘F’): print(i, end=",") print("\n")
修改矩阵元素的值
for i in np.nditer(a, op_flags=[‘readwrite’]): i[…] = 2 * i print(a)
NumPy矩阵操作
1.修改矩阵形状
a = a.reshape(2, 6) print(a)
2.迭代器
for element in a.flat: element = int(element / 2) print(element) print(a) # 注: 迭代器不影响矩阵本身的值
3.拷贝数组,对拷贝数组做操作不影响原数组
b = a.flatten
4. 展平数组元素
print(a.ravel())
5.转置
print(np.transpose(a))
6.轴变换
b = np.arange(8).reshape(2, 2, 2) # 生成222矩阵,轴0为深度,轴1位宽度,轴2位长度 print(b) print(np.rollaxis(b, 2, 1)) # 将轴2变换到轴1
7.轴交换
print(np.swapaxes(b, 1, 2))
8.修改数组维度
x = np.array([[1], [2], [3]]) y = np.array([4, 5, 6])
对 y 广播 x
b = np.broadcast(x, y)
它拥有 iterator 属性,基于自身组件的迭代器元组
print(‘对 y 广播 x:’, b)
矩阵算数运算
a = np.arange(1, 10, dtype=np.float_).reshape(3, 3) b = np.array([10, 10, 10]) print(a + b) print(a - b) print(a * b) print(a / b)
返回矩阵各个元素的倒数
print(np.reciprocal(a))
返回矩阵各个元素的幂
print(np.power(a, 2))
Numpy统计函数
print(a) print(np.amin(a, 1)) # 寻找最小纵轴 print(np.amax(a, 0)) # 寻找最大横轴 print(np.ptp(a)) # 寻找最大值和最小值的差 print(np.median(a)) # 寻找矩阵的中位数 print(np.mean(a)) # 矩阵的算数平均值 print(np.average(a, axis=0, weights=[1, 2, 3])) # 矩阵的加权平均值
标准差 std = sqrt(mean((x - x.mean())**2))
print(np.std(a))
Numpy排序、条件筛选函数
dt = np.dtype([(‘name’, ‘S10’), (‘age’, int), (‘height’, int), (‘weight’, int)]) matrix = np.array([(‘Hu’, 22, 167, 74), (‘Xian’, 23, 170, 75), (‘F’, 23, 169, 55)], dtype=dt) np.sort(matrix, order=‘weight’) print(matrix)
“”“Numpy矩阵库”""
1.矩阵的创建
print(np.ones((3, 3), dtype=int, order=‘C’)) # 全1阵 print(np.zeros((3, 3), dtype=int)) # 全0阵 print(np.eye(3, 4, 0, dtype=int)) # 0号对角线全为1的阵 print(np.identity(5, dtype=int)) # 单位阵
2.矩阵转置
print(matrix.T) print(np.transpose(matrix))
“”“NumpyLinearAlgebra”""
dot 两个数组的点积,即元素对应相乘。
vdot 两个向量的点积
inner 两个数组的内积
matmul 两个数组的矩阵积
determinant 数组的行列式
solve 求解线性矩阵方程
inv 计算矩阵的乘法逆矩阵
1.矩阵点乘2*3阶
a = np.array([[1, 2, 3], [4, 5, 6]]) # b = np.array([[7, 8], [9, 10], [11, 12]]) # 3*2阶 c = np.array([1, 2, 3]) d = np.array([4, 5, 6]) print(np.dot(c, c)) # 向量内积 print(np.dot(a, b)) # 矩阵乘法 print(np.vdot(c, c)) # 向量点乘
numpy.inner() 函数返回一维数组的向量内积。对于更高的维度,它返回最后一个轴上的和的乘积
print(np.inner(a, a)) # 对于23阶数组a,等价于aa.T
numpy.matmul 函数返回两个数组的矩阵乘积。 虽然它返回二维数组的正常乘积,但如果任一参数的维数大于2,则将其视为存在于最后两个索引的矩阵的栈,并进行相应广播。
可理解为升阶广播乘
print(np.matmul(a, c))
求解矩阵的行列式
e = np.array([[5, 2, 1], [1, 2, 5], [34, 1, 34]], dtype=int) print(e) print("det(e) = ", int(np.linalg.det(e)))
求解线性方程组
x + y + z = 6
2y + 5z = -4
2x + 5y - z = 27
A = np.array([[1, 1, 1], [0, 2, 5], [2, 5, -1]]) B = np.array([6, -4, 27]) print(np.linalg.solve(A, B)) # Numpy求解线性方程组 print(np.linalg.inv(A)) # 求解矩阵的逆
|