此外,Python还提供了array模块,它所提供的array和List不同,能直接保存数值,和C语言的一位数组类似,但它不支持多维数组,也没有各种运算函数。因此,Numpy就诞生了,它提供了两种基本对象,ndarray和ufunc,其中ndarray是存储单一数据类型的多维数组,而ufunc则是能够对数组进行处理的函数。
ndarray对象
1)创建数组array()函数
创建数组可以通过array()函数传递Python序列对象来创建数组。如果传递的是多层嵌套的序列,则创建多维数组,如:
>>> import numpy as np
>>> a = np.array([1,2,3])
>>> b = np.array((4,5,6))
>>> c = np.array([[1,2,3,4],[5,6,7,8]])
>>> b
array([4, 5, 6])
>>> c
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
>>>
2)Shape属性
数组的形状可以通过其shape属性获得,它是描述数组各维的大小的元祖(tuple):
>>> b.shape
(3,)
>>> c.shape
(2, 4)
>>>
可以通过改变shape属性,在保存元素个数不变的情况下,改变各个维数的大小,如:
>>> c.shape = 4,2
>>> c
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
>>>
注意:对shape属性的修改,不会改变数组元素在内容中的存储位置,而只是改变了各个维数的大小。如果将某个维的大小设置为-1时,则会根据实际情况来计算维数的大小,如:
>>> c.shape = 2,-1
>>> c
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
>>> c.shape
(2, 4)
>>>
3)reshape()方法
使用数组的reshape()方法,可以创建指定形状的新数组,而原数组保持不变,如:
>>> d = np.array([[1,2,3],
[4,5,6],
[7,8,9],
[10,11,12]])
>>> e = d.reshape((2,6))
>>> e
array([[ 1, 2, 3, 4, 5, 6],
[ 7, 8, 9, 10, 11, 12]])
>>> d
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
>>>
数组d和e共享数据的存储空间,如果修改其中一个数组的元素,则另外一个数组的元素也会对应被修改。
4)数组元素类型dtype属性
如上面e的元素类型:
>>> e.dtype
dtype('int32')
>>>
可以在创建数组的时候指定数据类型如:
>>> farr = np.array([1.0,2.0,3,4],dtype=np.float)
>>> farr.dtype
dtype('float64')
>>>
numpy中的数据类型可以通过如下获得:
>>> set(np.typeDict.values())
{<class 'numpy.bool_'>, <class 'numpy.uint8'>, <class 'numpy.datetime64'>, <class 'numpy.object_'>, <class 'numpy.int64'>, <class 'numpy.float96'>, <class 'numpy.int32'>, <class 'numpy.float64'>, <class 'numpy.int32'>, <class 'numpy.float32'>, <class 'numpy.int16'>, <class 'numpy.float16'>, <class 'numpy.int8'>, <class 'numpy.uint64'>, <class 'numpy.complex192'>, <class 'numpy.void'>, <class 'numpy.uint32'>, <class 'numpy.complex128'>, <class 'numpy.str_'>, <class 'numpy.uint32'>, <class 'numpy.complex64'>, <class 'numpy.bytes_'>, <class 'numpy.uint16'>, <class 'numpy.timedelta64'>}
>>>
numpy中用于创建数组的函数
1)arange( )函数
arange()类似于内置函数range(),通过指定初始值来创建一个等差数列,不包含中值,如:
>>> a = np.arange(0,2,0.2)
>>> a
array([ 0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8])
>>>
2)linspace( )函数
linspace( )函数通过指定初始值、终值和元素个数来创建等差数列,通过指定endpoint参数是否包含终值,默认为True,包含终值,如:
>>> b = np.linspace(0,1,10)
>>> c = np.linspace(0,1,10,endpoint=False)
>>> b
array([ 0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,
0.55555556, 0.66666667, 0.77777778, 0.88888889, 1. ])
>>> c
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
>>>
注意:endpoint会改变数组的等差步长。
3)logspace( )函数
logspace( )函数与linspace( )函数类似,它所创建的是等比数列。下面的例子从10^0到10^2产生5个元素的等比数列,注意起始值0表示10^0,2表示10^2:
>>> d = np.logspace(0,2,5)
>>> d
array([ 1. , 3.16227766, 10. , 31.6227766 , 100. ])
logspace()可以通过指定base参数,默认为10,并可以设置endpoint参数,如:
e = np.logspace(0,3,10,base=2,endpoint=False)
另外,
zeros()、ones()、emtpy()等可以创建指定形状和类型的数组,其他empty()函数仅仅分配数组所需的内容,不对数组元素进行初始化,如(值是随机的):
>>> np.empty((2,3),np.int)
array([[118, 1, 2],
[ 3, 4, 0]])
>>>
除此之外,
zeros_like()、ones_like()、empty_like()等函数可以创建与参数数组形状和类型相同的数组,因此zeros_like(a)与zeros(a.shape,a.dtype)等效。使用frombuffer()、fromstring()、fromfile等函数可以从字节序列或文件创建数组。
数组元素存取
1)使用下标和切片进行数据存取
该方式使用和列表List相同的方法对数组进行存取,但与列表不同的是数组共用同一数据存储空间,对数组的操作都会反映到原数组上。如:
>>> a = np.arange(10)
>>> a[2:4]=100,206
>>> a[:5]
array([ 0, 1, 100, 206, 4])
>>> a[:-1] #-1表示数组最后一元素
array([ 0, 1, 100, 206, 4, 5, 6, 7, 8])
>>> a[1:-1:2] #第三个餐松表示步长,每隔一元素获取一个
array([ 1, 206, 5, 7])
>>> a[::-1] #表示倒序
array([ 9, 8, 7, 6, 5, 4, 206, 100, 1, 0])
>>>
2)整数列表对数组元素进行存取
该方式对数组元素进行存取时,将使用列表中的每个元素作为下标。使用列表作为下标得到的数组不和原始数组共享数据,如:
>>> x = np.arange(10,1,-1)
>>> x
array([10, 9, 8, 7, 6, 5, 4, 3, 2])
>>> x[[3,3,4,1]]
array([7, 7, 6, 9])
>>> b = x[[3,3,-3,8]] #下标可以为负数
>>> b
array([7, 7, 4, 2])
>>> b[2] =200
>>> b
array([ 7, 7, 200, 2])
>>> x
array([10, 9, 8, 7, 6, 5, 4, 3, 2])
>>>
3)
整数数组对数组元素进行存取
当使用整数数组作为数组下标时,将得到一个形状和下标数组相同的新数组,新数组的每个元素都是用下标数组中对应位置的值作为下标从原数组获取的值,如:
>>> x = np.arange(10,1,-1)
>>> x[np.array([3,3,1,8])]
array([7, 7, 9, 2])
>>>
3)布尔
数组对数组元素进行存取
当使用布尔数组b作为下标对数组x进行元素存取时,将存取数组x中所有在数组b中对应下标为True的元素。