1. numpy库是几乎本书所有更高级工具的基础。它主要提供:
※ ndarray,速度快且空间高效的多维array,可进行向量化算术操作和更高级推广应用能力;
※ 标准数学函数,可快速执行整个array上的数据操作,而不需要写循环;
※ 读写硬盘数据的工具,以内存映射(memory-mapped)方式工作;
※ 线性代数,随机数生成,傅里叶变换功能;
※ 整合C++,C, Fortran代码功能;
NumPy本身并不提供高层次的数据分析功能,但是掌握NumPy arrays和面向array的操作可以帮助你高效的使用pandas这些工具。
2. ndarray(n-dimensional array object):多维array对象,可以很方便的存储、操作大量数据。
ndarray和python中的array不同,比如说操作符号*,+;python中array*10会返回10倍长度的array,相当于array中的内容重复10次,array+array相当于2倍长度。而numpy中的array*10会将array的内容全部乘以10,相当于10乘以这个array矩阵;array+array是两个array中的内容相加。可以定义一个python的array,然后用np.array()转化。另外,numpy中的array元素如果有一个是浮点数,那么这个array中的所有元素都会以浮点数存储。
data.shape: 返回data的维数;
data.dtype: 返回data的元素类型;
data.ndim:返回行数;
np.zeros():创建元素都为0的array,array的维数等于括号内赋给的维数;
np.ones():遇上一个类似,创建元素都为1的array,array的维数等于括号内赋给的维数shape;
np.empty():创建一个array,里面的所有元素都没有被初始化;
np.arange():类似于python中的range()函数,但是是以np.array形式返回的;
下面是ndarray的一些创建函数:
里面的ones_like,zeros_like,empty_like函数中的参数可以是其他array,这样会创建一个和其他array shape相同的ndarray。asarray将input转换为ndarray,如果Input已经是ndarray的话,不用复制。
3. Dtype
Dtype是使得NumPy变得强大的基础之一,在大多数情况下,Dtype可以直接将类型转换成机器表示,可以二进制方式读写硬盘来与底层语言C或Fortran连接。Python中的数字类型的解释如下图所示:
可以使用astype()函数将一个array的类型转换为另一种类型,如:
arr =np.array([1,2,3,4,5])
float_arr =arr.astype(np.float64)
而当将浮点型转换为整型时,小数点后的部分会被截掉;
另外,也可以用string类型保存数字,再将string转换成数字类型,如:
numeric_strings =np.array(['1.25', '-9.6', '42'], dtype=np.string_)
numeric_strings.astype(float)
即可将string类型存储的数字转换为数字类型,但是好像numeric_strings本身的类型并不改变,只改变显示的类型,如果需要本身的类型改变可能要重新赋值。注意np.string_是string类型的表达;当字符串类型不能转换为float类型时,会报出TypeError错误;
在用astype时还可以用其他array的type,比如string_arr =arr.type(numeric_strings.dtype)
当然,也可以用上述的TypeCode来代替指定的类型;
4. numpy的vectorization
arrays很重要因为它提供了可以批处理数据而不需要写任何for循环;这叫做vectorization;
比如说arr = np.array([[1.,2.,3.],[4.,5.,6.]]),可以进行arr * arr,arr ** 0.5,1/arr等运算,这些运算都是对array中的元素做相应的计算,即向量化的操作;
5. Basic indexing and slicing
Numpy中的下标和切片操作很丰富,它在一维上的操作类似于python,但也有些许不同;如:
arr =np.arange(10)
arr[5:8] = 12 # array([0,1,2,3,4,12,12,12,8,9])
arr_slice =arr[5:8]
arr_slice[1] =12345 #arr =array([0,1,2,3,4,12345,12,12,8,9])
可以看出两点:1)对切片可以按下标去读取和修改;2)当取出切片并对该切片进行修改时,修改的结果会反应在原array中;
所以如果是希望将原array中的数据拷贝出来操作时,需显式的给出.copy(),如
arr_slice2 =arr[5:8].copy()
对于N维数据而言,它相当于第一维[0]为N-1维数据,第[0][0]为N-2维数据,...,依次类推,当然也可以采用下标和slice等操作;如:
arr2d =np.array([[1,2,3],[4,5,6],[7,8,9]])
arr2d[1] # array([4,5,6])
arr2d[1][1] # 5
arr2d[1,1] # 5
可以看到最后两句结果是等同的,其实在numpy中访问下标可以写成这种逗号形式,它与两个中括号的表达相同;同样,在arr中的修改会反应在原始array中;在N维数据上的切片操作会在按维度数相应的反应出来;且多维的切片操作要在一个中括号里表示如arr2d[1,:2];
6. Boolean indexing
(注意:调用randn函数时,要用np.random.randn()来调用,否则会出现'module' object is not callable的错误)
比如说我们想判断一个string array中的元素是否等于'Bob',可以用==来实现,如:
然后,其实得到的这个Boolean类型的array是可以作为参数传递给其他array的,比如:
但是要注意这个boolean array的长度一定要与所要传进的array行的长度相同;boolean array实际上就是一个划分参数罢了,在data的其它维度上仍然可以进行slice,如
data[names=='Bob',2:]
boolean的操作,还可以是 !=,|,&等逻辑操作符(但python的and和or等关键字不能作为操作符),data [-(names=='Bob')]也可以表示除了Bob的其它元素;
data[data<0] =0 可以将data中小于0的元素全部设为0,很方便。