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 曲线拟合

Numpy中常用的保存与读取数据的方法_AI浩-CSDN博客_np.savez_compressed

【numpy】numpy数组运算 (2) - 哔哩哔哩

NumPy中数组和矩阵的基本运算 - 码农教程

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐