Numpy函数库基础介绍

版权声明:本文为博主原创文章,未经允许,不得转载,如需转载请注明出处 https://blog.csdn.net/ssjdoudou/article/details/83473955

写在最前面:机器学习的本质是数学,是数学在数据上的应用,python的Numpy函数库对于线性代数的处理有着很好的效果

构建一个5x5的随机数组

a = random.rand(5,5)
print(type(a))
print(a)
<class 'numpy.ndarray'>
[[0.25523539 0.18672544 0.13211871 0.02976256 0.27596135]
 [0.02602847 0.94473667 0.19747157 0.7082606  0.02579286]
 [0.60821924 0.15340741 0.14053278 0.64514422 0.55603114]
 [0.33629013 0.78294866 0.74654038 0.54908445 0.92103958]
 [0.76463527 0.78219568 0.04659293 0.33617911 0.00824435]]

此时大家可以看到,我们创建了一个数组。

然后我们把数组转化为矩阵

randomMat = mat(a)
print(type(randomMat))
print(randomMat)
<class 'numpy.matrixlib.defmatrix.matrix'>
[[0.44161805 0.83401376 0.61029327 0.05150283 0.92170338]
 [0.90328784 0.05417499 0.2890834  0.73348374 0.41682442]
 [0.93416784 0.41967522 0.96965584 0.1187087  0.58684984]
 [0.01172604 0.25642675 0.10434218 0.33808193 0.43006809]
 [0.75970918 0.0382442  0.45915119 0.68941119 0.16452291]]

由于这是分步运行的,产生的数组是个随机数组,所以每次数据都会不一样

Numpy函数库存在两种不同的数据类型,矩阵matrix和数组array。那么matrix和array有什么区别呢?其实matrix是包含在array里的,简单来说,你要是不知道什么时候用哪个,一律用array就肯定没问题。

Numpy matrix必须是2维的,但是 numpy arrays (ndarrays) 可以是多维的(1D,2D,3D····ND)。 matrix是Array的一个小的分支,包含于Array。所以matrix 拥有array的所有特性。

在numpy中matrix的主要优势是:相对简单的乘法运算符号。例如,a和b是两个matrices,那么a*b,就是矩阵积。而不用np.dot()。

下面来看一个栗子:

x = np.mat([[3,5],[2,6]])
print(x)
y = np.mat([[1,7],[6,4]])
print(y)
print(type(x))
print(x*y)
[[3 5]
 [2 6]]
[[1 7]
 [6 4]]
<class 'numpy.matrixlib.defmatrix.matrix'>
[[33 41]
 [38 38]]

这里我们直接定义了两个矩阵,此时可以看到,matrix可以直接使用*得到矩阵相乘的积。

我们再定义两个数组,如果直接相乘,结果并不是我们想要的

xx = np.array([[3,5],[2,6]])
print(xx)
yy = np.array([[1,7],[6,4]])
print(yy)
print(type(xx))
print(xx*yy)
print(np.dot(xx,yy))
[[3 5]
 [2 6]]
[[1 7]
 [6 4]]
<class 'numpy.ndarray'>
[[ 3 35]
 [12 24]]
[[33 41]
 [38 38]]

上图倒数第二个结果并不是两个数组相乘的正确结果,只是数组每个位置上数字的乘积,而正确输出数组乘积的应该是:

print(np.dot(xx,yy))

好,我们回到Numpy函数库的介绍

矩阵的逆:

randomMat = mat(random.rand(5,5))
print(type(randomMat))
print(randomMat,randomMat.I)
<class 'numpy.matrixlib.defmatrix.matrix'>
[[0.68775072 0.55116675 0.93077221 0.12091721 0.5814328 ]
 [0.43057471 0.61668641 0.29150797 0.06954227 0.46725422]
 [0.2599995  0.21906031 0.26223958 0.39303605 0.28256826]
 [0.29460098 0.66910716 0.70821986 0.22080112 0.90003657]
 [0.76028929 0.33743323 0.973075   0.93021911 0.72884654]] [[ -2.45164987   5.25417727 -11.0615229   -1.72802693   5.00977322]
 [  3.71563501  -3.39165379  14.96032473  -0.0394158   -6.54110922]
 [  3.78836154  -4.76392273   8.20658304   0.45518946  -3.71178508]
 [  0.69855233  -2.03752061   7.38608525  -0.13065884  -1.95321868]
 [ -5.11216288   5.05011211 -15.77074349   1.37986308   6.62289943]]

存储结果:

xrandomMat = randomMat.I

矩阵乘矩阵的逆,得到的应该是一个5x5的单位矩阵

[[ 1.00000000e+00  2.87815981e-16 -1.74683844e-16  9.11509282e-17
   5.05857032e-17]
 [-4.82206268e-16  1.00000000e+00 -1.16372757e-16  2.96491689e-16
  -6.02937360e-18]
 [ 5.27045023e-17 -7.69342830e-17  1.00000000e+00  2.34971904e-16
   6.95768890e-17]
 [-5.92025864e-16  3.21822869e-16 -1.09667017e-16  1.00000000e+00
   1.37530212e-16]
 [-3.05819205e-16  1.29351787e-16  1.00859225e-16  3.60001040e-16
   1.00000000e+00]]

但是我们发现除了对角线的5个数字,其余的元素并不完全是0,这是由于计算机处理的一点误差,我们用我们计算出来的单位矩阵减去创建的一个5x5的单位矩阵,得到误差矩阵

[[ 0.00000000e+00 -5.45624584e-17 -5.73678895e-17 -5.46094235e-17
   2.68868638e-17]
 [-1.00797709e-18 -1.11022302e-16 -9.62047088e-17 -4.14814528e-17
   1.21962924e-17]
 [ 2.73368064e-17  1.48584446e-16 -1.11022302e-16 -9.67898328e-17
   4.10587699e-17]
 [ 2.38316603e-17 -1.57699794e-16 -6.87584900e-17  2.22044605e-16
   3.90459055e-17]
 [ 6.75350523e-18  4.67157107e-17  8.11073271e-17  3.44711839e-17
   0.00000000e+00]]

矩阵的转置:

randomMat = mat(random.rand(5,5))
xrandomMat = randomMat.T
print(randomMat,xrandomMat)
[[0.39412548 0.10714949 0.01291286 0.29695853 0.61813766]
 [0.38583395 0.72695652 0.80252661 0.68591293 0.9086151 ]
 [0.14943146 0.59734579 0.76504651 0.51369465 0.22559721]
 [0.15521877 0.1703934  0.33845128 0.4338031  0.54092755]
 [0.71906317 0.53943771 0.20445043 0.85749641 0.53176807]] [[0.39412548 0.38583395 0.14943146 0.15521877 0.71906317]
 [0.10714949 0.72695652 0.59734579 0.1703934  0.53943771]
 [0.01291286 0.80252661 0.76504651 0.33845128 0.20445043]
 [0.29695853 0.68591293 0.51369465 0.4338031  0.85749641]
 [0.61813766 0.9086151  0.22559721 0.54092755 0.53176807]]

猜你喜欢

转载自blog.csdn.net/ssjdoudou/article/details/83473955
今日推荐