熟悉python,可以参考Python Tutorial或者廖雪峰的官方网站
安装Python和Numpy
建议安装ipython或bpython(推荐),一个强化版本的Python Shell,学习时非常方便.
后续的代码均在python3中测试通过。
Numpy的主要对象是同种元素的多维数组,这和Python的列表稍微不同,Python列表的元素类型可以不同。在Numpy中,维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank),比如:
[1, 2, 3]
是一个秩为1 的数组,轴长度为3;
[[1., 0., 0.],
[0., 1., 2.]]
数组的秩为2,第一维的维度为2,第二维维度为3.
Numpy的数组类被称作ndarray,常称为数组,ndarray的一些常用属性有:
ndarray.ndim
返回数组的秩,即数组轴的个数。
ndarray.shape
返回一个元组,该元组包含数组的维度,指示数组在每一维上的维度大小。
ndarray.size
返回数组中的元素个数,等于shape属性返回的元祖中元素的乘积。
ndarray.dtype
返回数组中元素的类型。
ndarray.itemsize
返回数组每个元素的字节大小
通常我们在程序中导入numpy包的方法如下:
import numpy as np
后续例子都默认使用以上语句导入了numpy。
>>> import numpy as np
>>> a = np.arange(15).reshape(3, 5)
>>> a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> a.shape
(3, 5)
>>> a.ndim
2
>>> a.dtype
dtype('int64')
>> a.dtype.name
'int64'
>>> a.itemsize
8
>>> a.size
15
>>> type(a)
<class 'numpy.ndarray'>
>>> b = np.array([1, 2, 3])
>>> b
array([1, 2, 3])
>>> type(b)
<class 'numpy.ndarray'>
以上例子中的arange(), reshape(), array()函数将在后续进行讲解,请按照以上代码进行测试。
使用np.array()函数来利用常规的Python列表和元组创建数组,数组元素类型根据原序列的元素来推导
>>> a = np.array([2, 3, 4])
>>> a
array([2, 3, 4])
>>> a.dtype
dtype('int64')
>>> b = np.array([1.1, 1.2, 1.3])
>>> b.dtype
dtype('float64')
>>> c = np.array([[1, 2, 3], [4, 5, 6]])# 创建二维数组
>>> c
array([[1, 2, 3],
[4, 5, 6]])
>>> c.dtype
dtype('int64')
>>> d = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float32) # 为数组指定元素类型
>>> d
array([[ 1., 2., 3.],
[ 4., 5., 6.]], dtype=float32)
>>> d.dtype
dtype('float32')
numpy中有一些方便的创建常见数组的函数,比如np.ones()创建全为1的数组,npp.zeros创建全为0的数组,np.empty()创建内容随机。这些函数创建的数组元素类型默认为np.float64
>>> np.zeros((3, 4))
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
>>> np.ones((2, 3, 4), dtype=np.float32)
array([[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]],
[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]]], dtype=float32)
>>> np.empty((2, 3))
array([[ 0.00000000e+000, 4.94065646e-324, 9.88131292e-324],
[ 1.48219694e-323, 1.97626258e-323, 2.47032823e-323]])
注意:使用这几个函数创建数组时,需指定数组形状,一元祖形式作为参数,而不是每一个维度单独作为参数,例如,创建一个2 × 3的数组,np.zeros((2, 3)).
numpy中有一个类似 python 中range() 的函数,np.arange(),作用和用法和range()一样,区别是返回一个数组,而不是列表
>>> np.arange(0, 10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.arange(0, 10, 2)
array([0, 2, 4, 6, 8])
np.linspace(start, end, num),将一个区间进行平分,结束节点end将包括在内, 这和np.arange()有点不同, 默认平分为50个数:
>>> np.linspace(0, 10, 10)
array([ 0. , 1.11111111, 2.22222222, 3.33333333,
4.44444444, 5.55555556, 6.66666667, 7.77777778,
8.88888889, 10. ])
>>> np.linspace(0, 9, 10)
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
numpy支持所有的算术运算,但都是按元素进行的(elementwise):
>>> a = np.array([1, 2, 3, 4])
>>> b = np.array([5, 6, 7, 8])
>>> c = b - a
>>> c
array([4, 4, 4, 4])
>>> a ** 2
array([ 1, 4, 9, 16])
>>> np.sin(a)
array([ 0.84147098, 0.90929743, 0.14112001, -0.7568025 ])
>>> a < 3
array([ True, True, False, False], dtype=bool)
矩阵的乘法,使用np.dot()来实现
>>> A = np.array([[1, 1], [1, 0]])
>>> B = np.array([[1 ,0], [0, 1]])
>>> np.dot(A, B)
array([[1, 1],
[1, 0]])
>>> A * B
array([[1, 0],
[0, 0]])
sum(), max(), min()函数返回数组元素的和、最大值、最小值,同时可以指定在哪一个axis进行运算
>>> a = np.arange(0,6).reshape(2,3)
>>> a
array([[0, 1, 2],
[3, 4, 5]])
>>> a.sum()
15
>>> a.sum(axis=0) # 在第一个axis上进行运算,在这里是列
array([3, 5, 7])
>>> a.sum(axis=1) # 在第二个axis上,即行
array([ 3, 12])
>>> a.max()
5
>>> a.max(axis=0)
array([3, 4, 5])
>>> a.max(axis=1)
array([2, 5])
>>> a.min()
0
>>> a.min(axis=0)
array([0, 1, 2])
>>> a.min(axis=1)
array([0, 3])
>>>
还有一些比如np.sin(), np.cos(),np.exp()等一些通用函数可进行复杂数学运算。