整个 NumPy库的基础是 ndarray( N-dimensional array,N维数组)对象。
它是一种由同质元素组成的多维数组,元素数量是事先指定好的。
同质指的是几乎所有元素的类型和大小都相同。
事实上,数据类型由另外一个叫作 dtype( data-type,数据类型)的 NumPy对象来指定;
每个 ndarray只有一种 dtype类型。
数组的维数和元素数量由数组的型( shape)来确定,
数组的型由N个正整数组成的元组来指定,元组的每个元素对应每一维的大小。
数组的维统称为轴(axes),
轴的数量被称作秩(rank)
NumPy数组的另一个特点是大小固定,也就是说,创建数组时一旦指定好大小,就不会再发生改变。
这与 Python的列表有所不同,列表的大小是可以改变的。
定义ndarray最简单的方式是使用array()函数,以python列表作为参数,列表的元素即是ndarray的元素
>>> import numpy as np
>>> a=np.array([1,2,3])
>>> a
array([1, 2, 3])
>>>
检测新创建的对象是否是ndarray很简单,只需要把新声明的变量传递给type()函数即可
>>> type(a)
<class 'numpy.ndarray'>
>>>
调用变量的dtype属性,即可获知新建得ndarray属于哪种数据类型
>>> a.dtype
dtype('int32')
>>>
我们刚建的这个数组只有一个轴,因而秩的数量为1,它的型为(3,1),这些值的获取方法如下:
轴数量需要使用ndim属性,
数组长度使用size属性,
数组的型要用shape属性
>>> a.ndim
1
>>> a.size
3
>>> a.shape
(3,)
>>>
你刚看到的这个数组再简单不过,只有一维。但是数组很容易就能拓展为多维。
例如,可以定义一个2*2的二维数组:这个数组有两条轴,所以秩为2,每条轴的长度为2
>>> b=np.array([[1.3,2.4],[0.3,4.1]])
>>> b.dtype
dtype('float64')
>>> b.size
4
>>> b.ndim
2
>>> b.shape
(2, 2)
>>>
ndarray对象拥有另一个叫做itemsize的重要属性,它定义了数组中的每个元素的长度为几个字节。
data属性表示的是包含数组实际元素的缓冲区。
该属性至今用的不多,因为要获取数组中的元素,使用接下来即将学习到的索引方法即可
>>> b.itemsize
8
>>> b.data
<memory at 0x0D573828>
>>>
数组的创建方法有几种,最常用的就是前面你见过的,使用array()函数,参数为单层或嵌套列表
>>> c=np.array([[1,2,3],[4,5,6]])
>>> c
array([[1, 2, 3],
[4, 5, 6]])
>>>
除了列表,array()函数还可以接受嵌套元组或元组列表作为参数
>>> c=np.array(((1,2,3),(4,5,6)))
>>> c
array([[1, 2, 3],
[4, 5, 6]])
>>>
此外,参数可以是由元组或列表组成的列表,效果一样
>>> e=np.array([(1,2,3),[4,5,6],[7,8,9]])
>>> e
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>>
目前为止,我们只使用过简单的整型和浮点型数据类型,其实numpy数组能够包含多种数据类型,例如,可以使用字符串类型
>>> g=np.array([["a","b"],["c", "d"]])
>>> g
array([['a', 'b'],
['c', 'd']], dtype=')
>>> g.dtype
dtype(')
>>> g.dtype.name
'str32'
>>>
numpy所支持的更多数据类型,请参考numpy学习笔记(一)
array()函数可以接收多个参数,每个ndarray()对象都有一个与之相关联的dtype对象
该对象唯一定义了数组中的每个元素的数据类型。
array()函数默认根据列表或元素序列中各元素的数据类型,为ndarray()对象指定最适合的数据类型。
但是,你可以用dtype选项作为函数array的参数,明确指定dtype的类型
例如,如要定义一个复数数组,可以像下面这样使用dtype选项
>>> f=np.array([[1,2,3],[4,5,6]],dtype=complex)
>>> f
array([[1.+0.j, 2.+0.j, 3.+0.j],
[4.+0.j, 5.+0.j, 6.+0.j]])
>>>
numpy库有几个函数能够生成包含初始值的N维数组,数组元素因函数而异。
zeros()函数能够生成由shape参数指定维度信息,元素均为零的数组。
举个例子,下述代码会生成一个3*3的二维数组:
>>> np.zeros((3,3))
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
>>>
ones()函数与上述类似,生成一个各个元素均为1的数组
>>> np.ones((3,3))
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
>>>
这两个函数默认使用float64数据类型创建数组。
arange(起始,终止,步长),按要求生成数组
>>> np.arange(0,10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.arange(4,10)
array([4, 5, 6, 7, 8, 9])
>>> np.arange(4,10,0.6)
array([4. , 4.6, 5.2, 5.8, 6.4, 7. , 7.6, 8.2, 8.8, 9.4])
>>>
如果要生成二维数组,仍然可以使用array()函数,但是要结合reshape()函数,后者按照指定的形状,把一维数组拆分为不同的部分
>>> np.arange(0,12).reshape(3,4)
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>>
另外一个跟arange()函数非常相似的函数是linspace(),它的前两个参数同样是用来指定序列的起始和结尾,但是第三个参数不再表示相邻两个数字之间的距离,而是用来指定我们想把由开头和结尾两个数字所指定的范围分为几个部分
>>> np.linspace(0,10,5)
array([ 0. , 2.5, 5. , 7.5, 10. ])
>>>
最后,来讲讲另外一个创建初始值的数组的方法:使用随机数填充数组。可以使用numpy.random模块的random()函数,数组所包含的元素数量由参数指定。
>>> np.random.random(3)
array([0.75059157, 0.5948985 , 0.23825111])
>>>
每次使用random()函数生成的数组,其元素均会有所不同,若要生成多维数字,只要把数组的大小作为参数传递给它
>>> np.random.random((3,3))
array([[0.7264183 , 0.2781729 , 0.94827723],
[0.25056767, 0.13371766, 0.43082973],
[0.71464014, 0.53118721, 0.47778133]])
>>>