基础
NumPy的主要对象是齐次多维数组。表由相同类型的元素组成(通常为数字),由一个正整数元组索引。在NumPy中维数被称为轴,轴数称为秩。例如,一个三维空间中点的坐标[1,2,1]是一个秩为1的数组,因为其轴数为1,轴的长度为3。在下图中,数组的秩为2(2维),第二维的长度为3。
[[ 1., 0., 0.],
[ 0., 1., 2.]]
NumPy的数组类是ndarray
,也称array
。需要注意numpy.array
和标准Python库类array.array
不同,后者只能处理一维数组,提供的功能较少。
ndarray
对象的主要属性如下所示:
ndarray.ndim
数组的轴的数量(维度的数量)。也称为秩。
ndarray.shape
数组的维度。这是用一个整数元组表示每个维度的数组的大小。比如一个n行m列的矩阵,shape为(n,m)。shape元组的长度即为秩
或者称为维度的数量,即ndim。
ndarray.size
数组中元素的个数总和。等于shape元组中元素的乘积。
ndarray.dtype
描述数组中的元素类型。可以使用标准的额Python类型生成或指定dtype。除此之外NumPy提供可一些独有的类型,如numpy.int32
,numpy.int16, numpy.float64等。
ndarray.itemsize
数组中每个元素的字节数的大小。例如,float64类型元素的itemsize值为8=(64/8),complex32类型元素的itemsize值为4=(32/8)。等同于ndarray.dtype.itemsize。
ndarray.data
包含实际数组元素的缓冲区。通常我们不会使用这个属性,因为我们将会使用索引来获取数组中的元素。
实例:
>>> 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.name
'int64'
>>> a.itemsize
8
>>> a.size
15
>>> type(a)
<type 'numpy.ndarray'>
>>> b = np.array([6, 7, 8])
>>> b
array([6, 7, 8])
>>> type(b)
<type 'numpy.ndarray'>
建立数组
有许多方法可以用来创建数组,比如利用numpy的array方法从Python的list或tuple创建数组。如上图所示。
但是array方法不能直接接收一串数字,如下图所示:
>>> a = np.array(1,2,3,4) # 错
>>> a = np.array([1,2,3,4]) # 对
将二维序列转换为二维数组:
>>> b = np.array([(1.5,2,3), (4,5,6)])
>>> b
array([[ 1.5, 2. , 3. ],
[ 4. , 5. , 6. ]])
也可以在创建数组时指定元素类型:
>>> c = np.array( [ [1,2], [3,4] ], dtype=complex )
>>> c
array([[ 1.+0.j, 2.+0.j],
[ 3.+0.j, 4.+0.j]])
经常会碰到数组的元素实现不知道,仅直到数组的大小。因此,numpy提供一些功能创建拥有初始占位符的数组。尽可能减少数组的增长,这是个昂贵的操作。
zero
方法创建一个元素全为0的数组,ones
方法创建一个元素全为1的数组,empty
方法创建一个元素内容随机且依赖内存状态的数组。默认情况下,创建的数组的元素类型为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.int16 ) # dtype can also be specified
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=int16)
>>> np.empty( (2,3) ) # uninitialized, output may vary
array([[ 3.73603959e-262, 6.02658058e-154, 6.55490914e-260],
[ 5.30498948e-313, 3.14673309e-307, 1.00000000e+000]])
为了创建数字序列,numpy提供了类似Python中range的方法,arange返回的是数组而不是列表。
>>> np.arange( 10, 30, 5 ) # 起始10,终止30,步长为5
array([10, 15, 20, 25])
>>> np.arange( 0, 2, 0.3 )
array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
当arange接收浮点参数时,由于有限的浮点精度,通常不能预测可获得的元素数量。因此,更好的选择是用linspace
接收指定生成的元素数量作为参数,替代arange中的步长。
>>> from numpy import pi
>>> np.linspace( 0, 2, 9 ) # 返回从0到2中间的9个数,包括2
array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])
>>> x = np.linspace( 0, 2*pi, 100 ) # 可以利用多个点评价函数
>>> f = np.sin(x)
打印数组
当打印数组时,numpy提供了一个类似Python嵌套列表的方法,但是遵守以下布局:
* 最后的维度(轴)从左至右打印
* 倒数第二维从上至下打印
* 其他维也从上至下打印,每个切片下由一个空行分隔
>>> a = np.arange(6) # 1d 维
>>> print(a)
[0 1 2 3 4 5]
>>>
>>> b = np.arange(12).reshape(4,3) # 2d