NumPy 使用笔记
NumPy是一个强大的开源库,用于表示矩阵,它基本实现了MATLAB的矩阵操作
1. 头文件
import numpy as np
2. array
2.1. 初始化
- 使用list进行初始化
a = [1, 2, 3, 4]
x = np.array(a)
- 使用array内部函数初始化
x = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
注意:这里没有写错,不是arrange
- 从硬盘读取数据
filename = "data.csv"
# delimiter 分隔符,也可以是空格,tab键或其它键
# skiprows 跳过最前面几行,因为最前面可能是表头
# usecols 使用哪几列,因为数据中有些列可能是我们不需要的
x = np.loadtxt(filename, delimiter=',', skiprows=1, usecols=(1, 2, 3), unpack=False)
# unpack 按列返回多个变量
# 此例中按列返回三个变量
x, y, z = np.loadtxt(filename, delimiter=',', skiprows=1, usecols=(1, 2, 3), unpack=True)
2.2. 矩阵运算
2.2.1. 形状变换
np.arange(16).reshape(2,8) #生成16个自然数,以2行8列的形式显示
# Out:
# array([[ 0, 1, 2, 3, 4, 5, 6, 7],
# [ 8, 9, 10, 11, 12, 13, 14, 15]])
2.2.2. 向量点乘
# 一维数组的点积:
a3 = np.array([1,2,3,4])
b3 = np.array([2,3,4,5])
dp1 = np.dot(a3,b3) # dp1的值为40
dp2 = a3 @ b3 # dp2的值为40
# 运算符@等价于点积运算函数np.dot
2.2.3. 矩阵乘法
# 矩阵乘法
C = np.matmul(A,B)
# 二维数组的点积:
a4 = np.array([[1,2,3],[2,3,4]])
b4 = np.array([[1,2],[2,5],[0,1]])
dp3 = np.dot(a4,b4) # dp3的值为array([[ 5, 15],[ 8, 23]])
dp4 = a4 @ b4 # dp4的值为array([[ 5, 15],[ 8, 23]])
# 运算符@等价于点积运算函数np.dot
# 二维数组与一维数组的点积:
a5 = np.array([[1,2,3],[2,3,4]])
b5 = np.array([1,2,3])
dp5 = np.dot(a5,b5) # dp5的值为array([14, 20])
dp6 = a5 @ b5 # dp6的值为array([14, 20])
# 运算符@等价于点积运算函数np.dot
a6 = np.matrix([[1,2,3],[1,2,1]])
b6 = np.matrix([[1,2],[3,4],[2,3]])
p3 = a6 * b6 # p3的值为matrix([[13, 19],[ 9, 13]])
p4 = np.dot(a6,b6) # p4的值为matrix([[13, 19],[ 9, 13]])
p5 = a6 @ b6 # p5的值为matrix([[13, 19],[ 9, 13]])
# 两个矩阵A(m×n)和B(n×k)相乘时,矩阵A的列数必须与矩阵B的行数相同,此时运算符*、@和点乘函数np.dot()三者是等价的
2.2.4. 矩阵求逆
B = np.linalg.inv(A)
2.2.5. 矩阵求伪逆
B = np.linalg.inv(A)
2.2.6. 转置
B = np.transpose(A)
my_array = np.arange(15).reshape(3,5)
print ('原数组:')
print (my_array)
print ('\n')
print ('转置数组:')
print (my_array.T)
'''
原数组:
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
转置数组:
[[ 0 5 10]
[ 1 6 11]
[ 2 7 12]
[ 3 8 13]
[ 4 9 14]]
'''
2.2.7. 加减乘除
元素对元素的运算,不是矩阵运算
import numpy as np
# 一维数组的加减乘除:
a1 = np.array([1,2,3,4])
b1 = np.array([4,3,2,1])
s1 = a1 + b1 # s1的值为array([5, 5, 5, 5])
d1 = a1 - b1 # d1的值为array([-3, -1, 1, 3])
p1 = a1 * b1 # p1的值为array([4, 6, 6, 4])
q1 = a1 / b1 # q1的值为array([0.25,0.66666667,1.5 ,4.])
# 二维数组的加减乘除:
a2 = np.array([[2,3,4],[1,2,5]])
b2 = np.array([[1,2,3],[2,3,4]])
s2 = a2 + b2 # s2的值为array([[3, 5, 7],[3, 5, 9]])
d2 = a2 - b2 # d2的值为array([[ 1, 1, 1],[-1, -1, 1]])
p2 = a2 * b2 # p2的值为array([[ 2, 6, 12],[ 2, 6, 20]])
q2 = a2 / b2 # q2的值为array([[2.,1.5,1.33333333],[0.5 ,0.66666667,1.25]])
2.3. 截取部分矩阵
# 二维数组
m = np.array([[0., -z, y], [z, 0., -x], [-y, x, 0.]])
# 取一部分,得二维数组
R = m[0:3, 0:3]
# 取一列,得一维数组
t = pose_camera_world[0:3, 3]
# 取一列,得二维数组
t = pose_camera_world[0:3, 3:4]
3. 统计函数
有min, max, median, mean等统计函数,它们都有两种调用方式
np.func(x)
x.func()
两种方式的实现原理相同,但实现上可能略有不同
# 生成随机向量,每个元素是1到100的随机整数,向量长度是10
x = np.random.randint(1, 100, 10)
np.min(x)
np.max(x)
np.mean(x)
# 两种调用方式等价
x.min()
x.max()
x.mean()
# 返回一个排序后的数组,但x本身并不改变
np.sort(x)
# 无返回值,x本身变成一个有序数组
x.sort()
4. 曲线拟合
import numpy as np
pinion_angle = data[0][1:-1]
wheel_angle = data[1][1:-1]
param = np.polyfit(pinion_angle, wheel_angle, 4) # 4次曲线拟合
function = np.poly1d(param)
fit_result = function(pinion_angle)
5. 数据存储
5.1. numpy.save
保存一个数组到一个二进制的文件中,保存格式是.npy
参数介绍
numpy.save(file, arr, allow_pickle=True, fix_imports=True)
file:文件名/文件路径
arr:要存储的数组
allow_pickle:布尔值,允许使用Python pickles保存对象数组(可选参数,默认即可)
fix_imports:为了方便Pyhton2中读取Python3保存的数据(可选参数,默认即可)
例:
import numpy as np
#生成数据
x = np.arange(10)
print(x)
#保存数据
np.save('save_x',x)
输出结果:

5.2. numpy.savez
这个同样是保存数组到一个二进制的文件中,但是厉害之处是,它可以保存多个数组到同一个文件中,保存格式是.npz,它其实就是多个前面np.save的保存的npy,再通过打包(未压缩)的方式把这些文件归到一个文件上,不行你去解压npz文件就知道了,里面是就是自己保存的多个npy.
参数介绍
numpy.savez(file, *args, **kwds)
file:文件名/文件路径
*args:要存储的数组,可以写多个,如果没有给数组指定Key,Numpy将默认从'arr_0','arr_1'的方式命名
kwds:(可选参数,默认即可)
例:
import numpy as np
x = np.arange(10)
print(x)
y=np.sin(x)
print("保存前的数据:")
print(x,y)
np.savez('save_xy',x,y)
npzfile=np.load('save_xy.npz')
xx=npzfile['arr_0']
yy=npzfile['arr_1']
print("保存后的数据:")
print(xx,yy)
输出结果:

5.3. numpy.savez_compressed
matrix = np.zeros((number, 5))
np.savez_compressed(output_path, matrix)
6. 数据读取
np.load()用于打开npz(包含多个数组)、npy(单个数组)文件。
参数
numpy.load(file, mmap_mode=None, allow_pickle=True, fix_imports=True, encoding=‘ASCII’)
示例
# 示例1
ac = np.load('mydata.npz')
# 示例2
with np.load(file_name) as f:
array_0, array_1 = f['arr_1'], f['arr_0']
7. 矩阵扩展
7.1. 自复制扩展
使用tile函数,有两种使用方法
列扩展,使用方法为np.tile(a, x), x为列倍数
import numpy as np
a = np.array([1, 2])
np.tile(a, 2)
# 结果为 array([1, 2, 1, 2])
行列扩展,使用方法为np.tile(a, (x, y)), x为行倍数,yo 列倍数
import numpy as np
a = np.array([1, 2])
np.tile(a, (2, 1))
# 结果为 array([[1, 2], [1, 2]])
7.2. 多数组组合
行组合vstack
import numpy as np
a = np.array([1, 2])
b = np.array([2, 3])
np.vstack([a, b])
# 结果为array([[1, 2], [2, 3]])
列组合hstack
import numpy as np
a = np.array([1, 2])
b = np.array([2, 3])
np.hstack([a, b])
# 结果为array([1, 2, 2, 3])
参考文献
Python曲线拟合_Jak的博客-CSDN博客_python 曲线拟合
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)