您的位置:首页 > 编程语言 > Python开发

《python for data analysis》笔记二--Numpy 基础:arrays 和向量化计算 1

2014-11-06 14:04 597 查看
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,很方便。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: