1 Numpy数组
在Python中有类似数组功能的数据结构,比如list
,但在数据量大时,list
的运行速度便不尽如意,Numpy(Numerical Python)提供了真正的数组功能,以及对数据进行快速处理的函数,Numpy中内置函数处理数据的速度是C语言级别的。Numpy支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。Numpy中的ndarray
类提供了python对多维数组对象的支持,并具备对矢量进行运算的能力,运算更为快速且节省空间。
ndarray
是N维数组对象(矩阵),其中所有的元素都必须是相同类型。ndarray
主要包含以下几个属性:
ndarray.ndim
:表示数组对象或矩阵的维度;
ndarray.shape
:表示每个维度上的数组的大小;
ndarray.size
:表示数组中元素的总数,等同于ndarray.shape中两个元素的乘积;
ndarray.dtype
:表示数组中元素的类型;
ndarray.itemsize
:表示数组中每个元素的字节大小,比如数据类型为float64的数组,其元素的字节大小为64/8=8。
比如:
>>> 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)
2 创建Numpy数组
array方法
>>> import numpy as np >>> a = np.array([2,3,4])#创建一维数组 >>> b = np.array([(1.5,2,3), (4,5,6)])#创建二维数组 >>> c = np.array( [ [1,2], [3,4] ], dtype=float64 )#创建指定数据类型的数组
如果想创建指定shape的数组,并使用占位符来初始化数组,可以用以下方法:
>>> np.zeros( (3,4) )#创建3行4列矩阵,用0初始化矩阵中所有的元素 array([[ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.]]) >>> np.ones( (2,3,4), dtype=np.int16 ) #创建三维矩阵,维度分别为2,3,4,且用1来初始化矩阵中所有的元素 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) ) #创建2行3列空矩阵,矩阵中元素初始值随机,取决于内存状态,默认情况下,创建的数组的dtype为float64。 array([[ 3.73603959e-262, 6.02658058e-154, 6.55490914e-260], [ 5.30498948e-313, 3.14673309e-307, 1.00000000e+000]])
对应的zeros、ones、empty
还有zeros_like、ones_like、empty_like
,它们以另一个数组为参数,根据其形状和dtype创建数组。
arange方法,与Python内置的range相似:
>>> numpy.arange(6) array([0,1,2,3,4,5,]) >>> np.arange( 10, 30, 5 ) array([10, 15, 20, 25])
3 数组基本数学操作
加、减、乘、点乘
>>> a = np.array( [20,30,40,50] ) >>> b = np.arange( 4 ) >>> b array([0, 1, 2, 3]) >>> c = a-b >>> c array([20, 29, 38, 47]) >>> 10*np.sin(a) array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854]) >>> a<35 array([ True, True, False, False]) >>> A = np.array( [[1,1], ... [0,1]] ) >>> B = np.array( [[2,0], ... [3,4]] ) >>> A*B #矩阵相乘 array([[2, 0], [0, 4]]) >>> A.dot(B) #矩阵点乘 array([[5, 4], [3, 4]]) >>> np.dot(A, B) #矩阵点乘 array([[5, 4], [3, 4]])
叠加、叠乘
>>> a = np.ones((2,3), dtype=int) >>> b = np.random.random((2,3)) >>> a *= 3 >>> a array([[3, 3, 3], [3, 3, 3]]) >>> b += a >>> b array([[ 3.417022 , 3.72032449, 3.00011437], [ 3.30233257, 3.14675589, 3.09233859]]) >>> a += b #浮点型不能转换成整型 TypeError: Cannot cast ufunc add output from dtype('float64') to dtype('int64') with casting rule 'same_kind'
取最大、最小、求和
>>> a = np.random.random((2,3)) >>> a array([[ 0.18626021, 0.34556073, 0.39676747], [ 0.53881673, 0.41919451, 0.6852195 ]]) >>> a.sum() 2.5718191614547998 >>> a.min() 0.1862602113776709 >>> a.max() 0.6852195003967595
对于多维矩阵,只在其中指定轴进行操作,使用axis
参数
>>> b = np.arange(12).reshape(3,4) >>> b array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> b.sum(axis=0) #对二维矩阵的列轴进行求和 array([12, 15, 18, 21]) >>> b.min(axis=1) #求二维矩阵的每个横轴最小值 array([0, 4, 8])
通用函数(ufunc),对ndarray
中的数据执行元素级运算,比如sin、cos、exp
等:
>>> B = np.arange(3) >>> B array([0, 1, 2]) >>> np.exp(B) array([ 1. , 2.71828183, 7.3890561 ]) >>> np.sqrt(B) array([ 0. , 1. , 1.41421356]) >>> C = np.array([2., -1., 4.]) >>> np.add(B, C) array([ 2., 0., 6.])
4 数组的索引、切片和遍历
和Python的list
数据结构类似,Numpy的一维数组也可以进行索引、切片以及遍历。
>>> a = np.arange(10)**3 >>> a array([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]) >>> a[2] 8 >>> a[2:5] array([ 8, 27, 64]) >>> a[:6:2] = -1000 #从0-6的元素中,每隔2个将元素值重新赋值为-1000 >>> a array([-1000, 1, -1000, 27, -1000, 125, 216, 343, 512, 729]) >>> for i in a: ... print(i + 1) -999 2 -999 28 -999 126 217 344 513 730
二维数组的索引、切片:
>>> def f(x,y): ... return 10*x+y ... >>> b = np.fromfunction(f,(5,4),dtype=int) #函数式创建数组,fromfunction第一个参数为函数f,第二个参数为数组的shape,shape第一个参数为函数f第一个参数的取值范围,第二个参数为函数f第二个参数的取值范围,dtype表示数组元素类型。 >>> b array([[ 0, 1, 2, 3], [10, 11, 12, 13], [20, 21, 22, 23], [30, 31, 32, 33], [40, 41, 42, 43]]) >>> b[2,3] #不是数组b中的第2行第三列的元素,而是索引为[2,3]的元素 23 >>> b[0:5, 1] #取出从第0行到第5行的第2个元素组成数组 array([ 1, 11, 21, 31, 41]) >>> b[ : ,1] #等同于前一句 array([ 1, 11, 21, 31, 41]) >>> b[1:3, : ] #取出第2行与第3行的所有元素组成数组 array([[10, 11, 12, 13], [20, 21, 22, 23]]) >>> for row in b: #遍历得到b数组的每一行元素 ... print(row) ... [0 1 2 3]