np.r_和np.c_算是numpy库中实现矩阵拼接的语法糖,函数名称简洁明了。比np.insert, np.vstack, np.concatenate等拼接方法使用简便。
r: 行方向拼接,即列数不变;
c: 列方向拼接,即行数不变。
t = np.arange(8)
A_r = np.r_[t, np.ones_like(t)]
A_c = np.c_[t, np.ones_like(t)]
print(t.shape)
print(A_r.shape)
print(A_c.shape)
np.vstack实现矩阵拼接:
t = np.arange(8)
h = np.hstack((t,np.ones_like(t)))
v = np.vstack((t,np.ones_like(t)))
print(h.shape)
print(v.shape)
np.concatenate实现矩阵拼接,因为concatenate方法只能对多维矩阵进行拼接,需要对np.range(8)的一维数据进行扩维,利用np.newaxis即可:
t = np.arange(8)
t_r = t[np.newaxis,:]
t_c = t[:,np.newaxis]
print(t_r.shape)
print(t_c.shape)
ccv = np.concatenate([t_r,t_r],axis=0)
cch = np.concatenate([t_r,t_r],axis=1)
print(ccv.shape)
print(cch.shape)
总结上述结果,可以发现:
axis=0: 对应着np.r_ 和 np.vstack,即行方向拼接,列数不变;
axis=1: 对应着np.c_ 和 np.hstack,即列方向拼接,行数不变;
应用示例,利用np.c_简单实现直线拟合:
nums = 10
x = np.arange(nums)
noise = [2 * i - 1 for i in np.random.rand(nums)]
y = x + noise
A = np.c_[x,np.ones_like(x)]
paras = np.linalg.lstsq(A,y,rcond=None)[0]
print(paras)
char = ''
if paras[1] > 0:
char = '+'
plt.rc('font',size=16)
plt.plot(x,y,'*',label='OriginalData',markersize=3)
plt.plot(x,A.dot(paras),'r',label="FittingLine:y={}*x{}{}".format(round(paras[0],3),char,round(paras[1],3)))
plt.legend()
plt.show()