让我们马上开始。 Numpy
是Python
的数学计算库。 它使我们能够高效地进行计算,比Python自带的列表强太多了。
在本文中,我将介绍机器学习和数据科学中经常会用到的Numpy
的基础知识。 我不打算涵盖Numpy
库的所有功能。 这是numpy教程系列的第一部分。
第一件事就是你导入Numpy
的方法:
import numpy as np
上面的语句用来告诉python
,在后续的代码中将使用np
来引用numpy
。
现在我们来分别创建python
和np
数组:
# python array
a = [1,2,3,4,5,6,7,8,9]
# numpy array
A = np.array([1,2,3,4,5,6,7,8,9])
如果只是打印输出,两者看不出太多的区别。
print(a)
print(A)
====================================================================[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1 2 3 4 5 6 7 8 9]
那么,为什么还要使用np
数组而不是Python
内置的数组?
答案在于,np
数组计算效率更高,也更易于操作。
如果你对这一点有兴趣深入了解,可以查看为什么用numpy代替python列表?。如果你想马上就练习下Numpy,推荐使用汇智网的在线Numpy运行环境。
让我们接下来看看更酷的东西:
np.arange()
np.arange(0,10,2)
====================================================================array([0, 2, 4, 6, 8]
arange([start],stop, [step])
的功能,是从start
开始,以step
为步长、以end
为结束条件(不包含该值),来生成一个数组。例如:np.arange(0,10,2)
的作用就是生成如下的数组:
array([0, 2, 4, 6, 8])
需要注意的是,最终生成的数组中不包含stop
。
下面是另一个示例:
np.arange(2,29,5)
====================================================================
array([ 2, 7, 12, 17, 22, 27])
在此我要提醒的是,这个数组也可以被称为矩阵或矢量。 所以,当我说矩阵的形状(shape
)为2×3
时,不要感到困惑,看起来不过就像这样的数组:
array([ 2, 7, 12,],
[17, 22, 27])
现在,我们来谈谈np
数组的形状(shape
)。
Shape
是np
数组的一个属性,表示数组的形状。例如:
A = [1, 2, 3, 4, 5, 6, 7, 8, 9]
A.shape
====================================================================
(9,)
这是一个1阶矩阵(数组),9
个元素构成一行。理想情况下,它就是一个1×9
的矩阵,对吗?
我同意你的看法,这就是reshape()
发挥作用的地方,它可以改变矩阵的维度。
让我们看看reshape()
的效果。 只要重构后的矩阵和原始矩阵具有相同数量的元素,就可以变形为任意多的维度:
A = [1, 2, 3, 4, 5, 6, 7, 8, 9]
A.reshape(1,9)
====================================================================
array([[1, 2, 3, 4, 5, 6, 7, 8, 9]])
请注意,reshape()
返回一个多维矩阵。 开头的两个方括号表明了这一点。 和[1,2,3,4,5,6,7,8,9]
相比,显然[[1,2,3,4,5,6,7,8,9]]
是具有多个维度的 。
再看另一个例子:
B = [1, 2, 3, 4, 5, 6, 7, 8, 9]
B.reshape(3,3)
====================================================================
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
查看B
的形状,它应该是(3,3)
:
B.shape
====================================================================
(3,3)
完美。 继续看np.zeros()
现在该你告诉我,下面的代码结果是什么:
np.zeros((4,3))
====================================================================
???????????
对,它会创建一个全是0
的4×3
的矩阵。 代码输出如下:
np.zeros((4,3))
====================================================================
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
np.zeros((n,m))
返回一个nxm
的零矩阵。 就这么简单。
再来猜一下:np.eye()是做什么的?
提示:eye()
表示Identity
。
np.eye(5)
====================================================================
array([[ 1., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 0.],
[ 0., 0., 1., 0., 0.],
[ 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 1.]])
np.eye()
返回一个具有指定维数的单位矩阵(Identity Matrix
)。
如果我们需要计算两个矩阵的乘积呢?
没问题,我们有np.dot()
。
np.dot()
执行矩阵乘法,前提是两个矩阵都是可乘的。 这意味着第一个矩阵的列数与第二个矩阵的行数必须匹配。
例如两个矩阵:A =(2,3)
和B =(3,2)
,A
的列数和矩阵B
中的行数都是3
,因此A
和B
是可以相乘的。
还是让看看矩阵相乘的代码吧:
# generate an identity matrix of (3 x 3)
I = np.eye(3)
I
====================================================================
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
# generate another (3 x 3) matrix to be multiplied.
D = np.arange(1,10).reshape(3,3)
D
====================================================================
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
现在把两个矩阵相乘:
# perform actual dot product.
M = np.dot(D,I)
M
====================================================================
array([[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.]])
很好! 现在你知道计算矩阵的乘法是多么地简单了! 另外请注意,数组现在是浮点型的。
那么如何累加矩阵的元素呢?
# add all the elements of matrix.
sum_val = np.sum(M)
sum_val
====================================================================
45.0
np.sum()
的功能就是累加矩阵中的全部元素。
不过,它有2
种不同的调用形式。
1. 按行累加
# sum along the rows
np.sum(M,axis=1)
====================================================================
array([ 6., 15., 24.])
6
是第1行(1,2,3)
的总和。
15
是第二行(4,5,6)
的总和。
24
是第3行(7,8,9)
的总和。
2.按列累加
# sum along the cols
np.sum(M,axis=0)
====================================================================
array([ 12., 15., 18.])
12
是第一列(1,4,7)
的总和。
15
是第二列(2,5,8)
的总和。
18
是第三列(3,6,9)
的总和。
原文:Introduction to Numpy -1 : An absolute beginners guide to Machine Learning and Data science.