NumPy的主要对象是同类多维数组,这是一个相同类型的元素(通常是数字)组成的表。在NumPy中,维度称为axis,axis的数量叫做rank。
例如,三维空间中的一个坐标为[1, 2, 1]的点,即为rank=1的数组,因为这个数组只有一个axis。有些人可能会有疑惑,不是说三维空间么,为什么说它只有一个axis呢?axis可以理解成轴,抛开这个点,单看这个数组[1, 2, 1],它确实只需要一个axis即可表示。这个axis长度为3。
又如,[[ 1., 0., 0.],[ 0., 1., 2.]],这个数组的rank=2(2维的)。第一维(axis)长度为2,第二维长度为3。
也可以这么理解,数组是由2个行向量组成,所以第一维长度为2,每个行向量由3个向量(点)组成,所以第二维长度为3。
Numpy的数组类称为ndarray。numpy.array和Python标准库中的array.array是两回事,标准库中的array.array只能处理一维数组且只提供了少数的功能。ndarray对象中更加重要的特性如下:
ndarray.ndim
数组的axis(维)的数量。在Python中,维的数量被称作rank。ndarray.shape
数组的各个维(注意和维和维数要区分开)。它是一个数组各个维的长度构成的整数元组。对n行m列矩阵而言,shape将是(n,m)。因此,shape元组的长度也就是rank,也是维数ndim。ndarray.size
数组所有元素总数量。等于shpe元组各元素的乘积。ndarray.dtype
一个描述数组中元素类型的对象。用户可以使用Python标准类型创建或指定dtype。此外,NumPy还提供了其自有的类型,比如numpy.int32, numpy.int16, numpy.float64。ndarray.itemsize
数组各元素的占多少字节。比如,一个元素类型是float64的数组,其itemsize为8(=64/8,64位除以8)。同理,元素类型是complex32的数组的itemsize为4(=32/8)。ndarray.itemsize等于ndarray.dtype.itemsize。ndarray.data
装载数组真实元素的缓冲区。通常,我们用不到这个属性,因为我们一般使用索引访问数组元素。
1. 一个例子
>>> 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'>
2. 创建数组
有多种方法来创建数组。
你可以利用常规的Python列表或元组同伙array函数来创建一个数组。创建出的数组类型和序列元素类型是一致的。
>>> import numpy as np
>>> a = np.array([2,3,4])
>>> a
array([2, 3, 4])
>>> a.dtype
dtype('int64')
>>> b = np.array([1.2, 3.5, 5.1])
>>> b.dtype
dtype('float64')
>>> c = np.array(('a','b','c'))
>>> c
array(['a', 'b', 'c'],
dtype='|S1')
>>> c.shape
(3,)
>>> c.size
3
>>> c.ndim
1
>>> c.dtype
dtype('S1')
注意,array函数只接收一个参数,且这个参数是一个python序列。常见的错误是给array函数传递多个数字作为参数,如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]])
一般情况是,数组元素最初是未知的,但其size是已知的。因此,NumPy提供了一些函数,利用初始的占位符来创建数组。这些函数减少了费时费力的手动填充数组的成本。
函数zeros可以创建一个全部填充0的数组;函数ones创建的数组全部填充为1;函数empty创建的函数的初始内容是随机的,依赖于内存状态。默认情况下,这些函数创建的数组的dtype是float64。
>>> a = np.zeros((3,4))
>>> a
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
>