《利用Python进行数据分析》---Numpy基础:数组和矢量运算
NumPy的ndarray:一种多维数组对象
本章会介绍Numpy的基本用法,虽然大多数数据分析工作不需要深入理解NumPy,但是精通面向数组的编程和思维方式是成为Python科学计算牛人的一大关键步骤
创建ndarray
创建数组最简单的方法就是使用array函数。它接受一切序列型的对象(包括其他数组),然后产生一个新的含有传入数据的NumPy数组。
嵌套序列:
(除非显示说明,np.array会尝试为新建的这个数组的这个数组推断出一个较为合适的数据类型。)
每个数组都有一个shape(一个表示个维度大小的数组)
arange是Python内置函数range的数组版。类似于内置的range,但返回的是一个ndarray而不是列表
ndarray的数据类型
dtype(数据类型)是一个特殊的对象,它含有ndarray将一块内存解释为特定数据类型所需的信息
可以通过ndarray的astype方法显示地转换其dtype
如果某字符串数组表示的全是数字,也可以用astype将其转换为数值形式:
注意string后面有个"_"
写的是float,而不是np.float64;NumPy很聪明,它会将Python类型映射到等价的dtype上。
注意:调用astype无论如何都会创建出一个新的数组(原始数据的一份拷贝),即使新dtype跟老dtype相同也是如此
数组和标量之间的运算
数组很重要,因为它使你不用编写循环即可对数据执行批量运算。这通常叫做矢量化。大小相等的数组之间的任何算术运算都会将运算应用到元素级。不同大小的数组之间的运算叫做广播,将在12章进行介绍,本书的内容不需要对广播机制有多深的理解
数组与标量的算术运算也会将那个标量值传播到各个元素
基本的索引和切片
从表面上看,它们跟Python列表的功能差不多:
跟列表最重要的区别在于,数组切片是原始数组的视图。这意味着数据不会被复制,视图上的任何修改都会直接反应到源数组上
这样做的原因:由于NumPy的设计目的是处理大数据,所以你可以想象以下,假如NumPy坚持要将数据复制来复制去的话会产生何等的性能和内存问题
如果你想要得到的是ndarray切片的一份副本而非视图,就需要显示地进行复制操作,例如arr[5:8].copy()
对于高维数组,能做的事情更多。在一个二维数组中,各索引位置上的元素不再是标量而是一维数组:
可以传入一个以逗号隔开的索引列表来选取单个元素。也就是说,下面两种方式是等价的