数据输出

  • 改变默认的输出格式(默认为科学计数法)
np.set_printoptions(suppress=True)

声明矩阵

  • 行向量
    a = np.array([[1,2,3]])
  • 列向量
    a = np.array([[1,2,3]]).T

^declare-matrix

零矩阵与初始化大小但不赋值的矩阵

  • 使用np.zeros((4,4))声明一个零矩阵。np.empty只初始化不赋值,可能会出现为nan的值。注意两者的区别:

    empty, unlike zeros, does not set the array values to zero, and may therefore be marginally faster. On the other hand, it requires the user to manually set all the values in the array, and should be used with caution.

矩阵元素的数据类型

  • 默认矩阵类型为int64(如果声明时赋值均为整数形式,不包含小数点)或float64(声明时包含小数点),可以通过a.astype('float64')将整数类型的矩阵转换为浮点数。

矩阵的保存与读取

  • 保存单个矩阵:np.save("YOUR_FILE_NAME", your_mat),文件名不需要包含扩展名,保存时将自动加上扩展名.npy
  • 将多个矩阵保存至一个文件:np.savez("YOUR_FILE_NAME", MAT_KEY1=your_mat1, MAT_KEY2=your_mat2,...),文件名不需要包含扩展名,保存时将自动加上扩展名.npz,其中MAT_KEY*为相应矩阵的键值(key)。
  • 读取mat = np.load("YOUR_FILE_NAME"),文件名需要包含扩展名,如test.npz
    • mat.files将给出所有键值名
np.savez(filename, img=my_img, mat=my_mat)
  • 读取复合类型数据使用
data = np.load(filename, allow_pickle=True)
img = data["img"]
mat = data["mat"]

切分矩阵

  • 取单行
    mat1 = mat[i:i+1, :]
  • 取n行
    mat1 = mat[i:i+n, :]
  • 取单列
    mat1 = mat[:, i:i+1]
  • 取n列
    mat1 = mat[:, i:i+n]

从齐次矩阵中取出旋转矩阵和位移向量

  • 提取旋转矩阵
rot = ht[:3, :3]
  • 提取位移向量
    • 取最后一列转为行向量(
    tvec = ht[:3, 3]
    • 取最后一列转为列向量(
    tvec = ht[:3, 3].reshape(-1,1)

修改矩阵

  • 修改一列中的部分参数:q[:3,3]=[1,2,3] q为numpy.array类型 注意,修改时提供的数据类型要与矩阵中元素的数据类型一致,如q.dypte为int64,那么使用[0.1, 0.2, 0.3]就无法正确给矩阵赋值,需要矩阵元素类型为float64或其它浮点型,可以使用astype()修改成匹配的元素数据类型。

从旋转和平移构造齐次变换矩阵

  • 输入:四元数/欧拉角rot表示旋转,列向量trans表示平移
  • 使用四元数或者欧拉角,构造一个的齐次变换矩阵q ht[:3,:3] = np.dot(rot, ht[:3,:3])
  • 修改q的最后一列q[:3,3]=np.array(trans)

np.stack vs. np.hstack vs. np.vstack

  • 假设有 np.array,维度为:(2,3,4):
    a=np.array([[[1,2,3,4],
                 [4,5,6,7],
                 [6,7,8,9]],
                [[7,8,9,10],
                 [9,10,11,12],
                 [11,12,13,14]]])
    We can visualize the array like this:
    One element can be represent as a[i, j, k]; i on axis=0; j on axis=1; k on axis=2. np.stack([a, a])得到的矩阵维度为(2,2,3,4) np.vstack([a, a])得到的矩阵维度为(4,3,4) np.hstack([a, a])得到的矩阵维度为(2,6,4)
  • np.vstack vs. np.hstack:
result
np.vstack([a,a])
(4,3,4)
bond along axis=0
np.hstack(a,a)
(2,6,4)
bond alone axis=1
  • np.stack along different axis:
result
np.stack([a,a],axis=0)
(2,2,3,4)
extra axis->new axis0
old axis0->new axis1
old axis1->new axis2
old axis2->new axis3
np.stack([a,a],axis=1)
(2,2,3,4)
old axis0->new axis0
extra axis->new axis1
old axis1->new axis2
old axis2->new axis3
np.stack([a,a],axis=2)
(2,3,2,4)
old axis0->new axis0
old axis1->new axis1
extra axis->new axis2
old axis2->new axis3
np.stack([a,a],axis=3)
(2,3,4,2)
old axis0->new axis0
old axis1->new axis1
old axis2->new axis2
extra axis->new axis3

数据排序

  • 根据某一列数据进行排序
    • argsort返回的只是排好序后的行索引,不会改变原数组。
    data = data[data[:,2].argsort()]
  • 根据某一行数据进行排序
    data = data[:,data[2].argsort()]
  • 一组二维坐标系下的坐标进行排序
    • 根据x坐标的值进行排序
      sort_x = cont[cont[:,0].argsort()]
    • 根据y坐标的值进行排序
      sort_y = cont[cont[:,1].argsort()]

四元数numpy-quaternion

  • 不推荐,插值之后会出现无法求解IK的情况?可能是归一化有问题
  • 使用scipy替代

配置

  • 安装numpy-quaternionpip3 install numpy-quaternion

函数

基本操作

  • 声明与元素的取用
import numpy as np
import quaternion
q1 = np.quaternion(1, 0, 0, 0)
q2 = np.quaternion(0, 1, 0, 0)
 
print(q1.x)

Slerp插值

  • slerp()slerp_evaluate()slerp_vectorized()三个方法,其中slerp()调用slerp_vectorized()
  • 使用方法,qs为列表,其中每个元素均为np.quaternion
import numpy as np
import quaternion
q1 = np.quaternion(1, 0, 0, 0)
q2 = np.quaternion(0, 1, 0, 0)
 
t = list(range(5))
 
qs = quaternion.slerp(q1, q2, t[0], t[-1], np.array(t))